From f3cde998fa4559391df24417c71fd0bcb25504e6 Mon Sep 17 00:00:00 2001 From: David Keeler Date: Tue, 21 Mar 2017 13:23:09 -0700 Subject: [PATCH 001/300] bug 1344584 - proactively close streams in test_be_conservative.js to prevent leaks r=mcmanus MozReview-Commit-ID: 89h5lQJum6c --- netwerk/test/unit/test_be_conservative.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/netwerk/test/unit/test_be_conservative.js b/netwerk/test/unit/test_be_conservative.js index 2c6ac46ad543a..4bbc1d4e5012d 100644 --- a/netwerk/test/unit/test_be_conservative.js +++ b/netwerk/test/unit/test_be_conservative.js @@ -73,6 +73,7 @@ class InputStreamCallback { stop() { this.stopped = true; + this.output.close(); } } @@ -89,9 +90,7 @@ class TLSServerSecurityObserver { do_print(`TLS version used: ${status.tlsVersionUsed}`); if (this.stopped) { - do_print("handshake done callback stopped - closing streams and bailing"); - this.input.close(); - this.output.close(); + do_print("handshake done callback stopped - bailing"); return; } @@ -102,6 +101,8 @@ class TLSServerSecurityObserver { stop() { this.stopped = true; + this.input.close(); + this.output.close(); this.callbacks.forEach((callback) => { callback.stop(); }); From b672ca4a6594b789a05dd42495067c49add60644 Mon Sep 17 00:00:00 2001 From: David Keeler Date: Tue, 21 Mar 2017 13:56:57 -0700 Subject: [PATCH 002/300] bug 1344585 - close streams and server sockets in test_tls_server.js to prevent leaks r=mcmanus MozReview-Commit-ID: 28v2rhrcktS --- netwerk/test/unit/test_tls_server.js | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/netwerk/test/unit/test_tls_server.js b/netwerk/test/unit/test_tls_server.js index d805359c7b979..5bba42ae7559f 100644 --- a/netwerk/test/unit/test_tls_server.js +++ b/netwerk/test/unit/test_tls_server.js @@ -87,7 +87,11 @@ function startServer(cert, expectingPeerCert, clientCertificateConfig, } }, 0, 0, Services.tm.currentThread); }, - onStopListening: function() {} + onStopListening: function() { + do_print("onStopListening"); + input.close(); + output.close(); + } }; tlsServer.setSessionCache(false); @@ -96,7 +100,7 @@ function startServer(cert, expectingPeerCert, clientCertificateConfig, tlsServer.asyncListen(listener); - return tlsServer.port; + return tlsServer; } function storeCertOverride(port, cert) { @@ -136,6 +140,9 @@ function startClient(port, cert, expectingBadCertAlert) { } catch (e) { let errorCode = -1 * (e.result & 0xFFFF); if (expectingBadCertAlert && errorCode == SSL_ERROR_BAD_CERT_ALERT) { + do_print("Got bad cert alert as expected"); + input.close(); + output.close(); inputDeferred.resolve(); } else { inputDeferred.reject(e); @@ -221,13 +228,15 @@ add_task(function*() { for (let v of versions) { prefs.setIntPref("security.tls.version.max", v.prefValue); for (let t of tests) { - let port = startServer(cert, - t.expectingPeerCert, - t.clientCertificateConfig, - v.version, - v.versionStr); - storeCertOverride(port, cert); - yield startClient(port, t.sendClientCert ? cert : null, t.expectingBadCertAlert); + let server = startServer(cert, + t.expectingPeerCert, + t.clientCertificateConfig, + v.version, + v.versionStr); + storeCertOverride(server.port, cert); + yield startClient(server.port, t.sendClientCert ? cert : null, + t.expectingBadCertAlert); + server.close(); } } }); From 965ad58a5f504fc51c4273266545bf82cb782e4a Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Wed, 15 Mar 2017 10:43:51 -0700 Subject: [PATCH 003/300] Bug 1319620 - Check that IPDL unit tests in error/ fail for the right reason. r=billm An IPDL unit test that is intended to fail should check that the reason the test fails matches the expected reason for failure. We have had a number of cases where some change, like renaming a keyword, causes tests to start failing for the wrong reason, which means they are no longer testing anything useful. To support this, each file in error/ must contain one or more error annotations. An error annotation is a line starting with "//error:", followed by whatever the rest of the expected error is. For every one of these annotations that a file has, the stderr output of compiling the test must contain the specified string, including the "error:". It is also an error for an error/ file to not contain an error annotation. To generate the initial set of annotations, I just copied and pasted the error that each test produced. I did some light auditing to check that the errors are reasonable, which did turn up one minor error which I fixed as part of bug 1347527. This patch does not check that every error produced by compiling the file is in the list of expected errors. I think that's less of a problem if it does occur. MozReview-Commit-ID: BrePLGPPRil --- ipc/ipdl/test/ipdl/IPDLCompile.py | 7 ++--- ipc/ipdl/test/ipdl/error/AsyncInsideSync.ipdl | 3 +++ ipc/ipdl/test/ipdl/error/AsyncReturn.ipdl | 2 ++ .../test/ipdl/error/BadNestedManagee.ipdl | 2 ++ .../test/ipdl/error/BadNestedManager.ipdl | 2 ++ .../test/ipdl/error/ForgottenManagee.ipdl | 2 ++ .../test/ipdl/error/ForgottenManager.ipdl | 2 ++ .../test/ipdl/error/InsideCpowToChild.ipdl | 3 +++ .../test/ipdl/error/IntrAsyncManagee.ipdl | 2 ++ .../test/ipdl/error/IntrAsyncManager.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/IntrSyncManagee.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/IntrSyncManager.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/ManageeForgot.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/ManagerForgot.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/Nullable.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/Nullable2.ipdl | 2 ++ .../test/ipdl/error/SyncAsyncManagee.ipdl | 2 ++ .../test/ipdl/error/SyncAsyncManager.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/array_Recursive.ipdl | 2 ++ .../test/ipdl/error/asyncMessageListed.ipdl | 2 ++ .../test/ipdl/error/badProtocolInclude.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/compressCtor.ipdl | 3 +++ .../test/ipdl/error/compressCtorManagee.ipdl | 3 +++ .../test/ipdl/error/conflictProtocolMsg.ipdl | 2 ++ .../test/ipdl/error/cyclecheck_Child.ipdl | 3 +++ .../ipdl/error/cyclecheck_Grandchild.ipdl | 3 +++ .../test/ipdl/error/cyclecheck_Parent.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/dtorReserved.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/empty.ipdl | 2 +- .../test/ipdl/error/intrMessageCompress.ipdl | 3 +++ ipc/ipdl/test/ipdl/error/lex1.ipdl | 1 + .../test/ipdl/error/manageSelfToplevel.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/managedNoCtor.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/managedNoDtor.ipdl | 1 + ipc/ipdl/test/ipdl/error/managerNoCtor.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/managerNoDtor.ipdl | 2 ++ .../test/ipdl/error/messageNoDirection.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/multimanDupMgrs.ipdl | 2 ++ .../test/ipdl/error/multimanDupMgrsMgr.ipdl | 2 ++ .../ipdl/error/multimanNonexistentMgrs.ipdl | 3 +++ ipc/ipdl/test/ipdl/error/mutualRecStruct.ipdl | 4 +++ .../test/ipdl/error/mutualRecStructUnion.ipdl | 4 +++ ipc/ipdl/test/ipdl/error/noEmptyToplevel.ipdl | 2 ++ .../test/ipdl/error/noProtocolInHeader.ipdlh | 2 ++ .../test/ipdl/error/oldIncludeSyntax.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/parser.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/redeclMessage.ipdl | 3 +++ .../test/ipdl/error/redeclParamReturn.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/redeclScope.ipdlh | 2 ++ ipc/ipdl/test/ipdl/error/shmem.ipdl | 3 +++ ipc/ipdl/test/ipdl/error/structRedecl.ipdl | 2 ++ .../test/ipdl/error/structUnknownField.ipdl | 2 ++ .../test/ipdl/error/syncMessageCompress.ipdl | 2 ++ .../test/ipdl/error/syncParentToChild.ipdl | 2 ++ .../test/ipdl/error/tooWeakIntrAsync.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/tooWeakIntrSync.ipdl | 2 ++ .../test/ipdl/error/tooWeakSyncAsync.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/twoprotocols.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/undeclParamType.ipdl | 2 ++ ipc/ipdl/test/ipdl/error/undeclProtocol.ipdl | 3 +++ .../test/ipdl/error/undeclReturnType.ipdl | 2 ++ .../test/ipdl/error/undefMutualRecStruct.ipdl | 4 +++ .../ipdl/error/undefMutualRecStructUnion.ipdl | 4 +++ .../test/ipdl/error/undefMutualRecUnion.ipdl | 4 +++ .../test/ipdl/error/undefSelfRecStruct.ipdl | 2 ++ .../test/ipdl/error/undefSelfRecUnion.ipdl | 2 ++ .../test/ipdl/error/unknownIntrMessage.ipdl | 2 ++ .../test/ipdl/error/unknownSyncMessage.ipdl | 2 ++ ipc/ipdl/test/ipdl/runtests.py | 26 ++++++++++++++++++- 69 files changed, 181 insertions(+), 5 deletions(-) diff --git a/ipc/ipdl/test/ipdl/IPDLCompile.py b/ipc/ipdl/test/ipdl/IPDLCompile.py index d642d159f0d2c..74f8161330d4e 100644 --- a/ipc/ipdl/test/ipdl/IPDLCompile.py +++ b/ipc/ipdl/test/ipdl/IPDLCompile.py @@ -50,12 +50,13 @@ def completed(self): and isinstance(self.stderr, str)) - def error(self): + def error(self, expectedError): '''Return True iff compiling self.specstring resulted in an IPDL compiler error.''' assert self.completed() - return None is not re.search(r'error:', self.stderr) + errorRe = re.compile(re.escape(expectedError)) + return None is not re.search(errorRe, self.stderr) def exception(self): @@ -71,5 +72,5 @@ def ok(self): assert self.completed() return (not self.exception() - and not self.error() + and not self.error("error:") and (0 == self.returncode)) diff --git a/ipc/ipdl/test/ipdl/error/AsyncInsideSync.ipdl b/ipc/ipdl/test/ipdl/error/AsyncInsideSync.ipdl index 50a7bb236504d..d5358d260ed6b 100644 --- a/ipc/ipdl/test/ipdl/error/AsyncInsideSync.ipdl +++ b/ipc/ipdl/test/ipdl/error/AsyncInsideSync.ipdl @@ -1,5 +1,8 @@ // inside_sync nested messages must be sync +//error: inside_sync nested messages must be sync (here, message `Msg' in protocol `AsyncInsideSync') +//error: message `Msg' requires more powerful send semantics than its protocol `AsyncInsideSync' provides + protocol AsyncInsideSync { child: nested(inside_sync) async Msg(); diff --git a/ipc/ipdl/test/ipdl/error/AsyncReturn.ipdl b/ipc/ipdl/test/ipdl/error/AsyncReturn.ipdl index 479d51a80a9b4..0343496bb9505 100644 --- a/ipc/ipdl/test/ipdl/error/AsyncReturn.ipdl +++ b/ipc/ipdl/test/ipdl/error/AsyncReturn.ipdl @@ -1,5 +1,7 @@ // Async messages are not allowed to return values. +//error: asynchronous message `Msg' declares return values + protocol AsyncReturn { child: async Msg() returns(int32_t aNumber); diff --git a/ipc/ipdl/test/ipdl/error/BadNestedManagee.ipdl b/ipc/ipdl/test/ipdl/error/BadNestedManagee.ipdl index 94dcb44229f0f..41c88410c97d9 100644 --- a/ipc/ipdl/test/ipdl/error/BadNestedManagee.ipdl +++ b/ipc/ipdl/test/ipdl/error/BadNestedManagee.ipdl @@ -1,3 +1,5 @@ +//error: protocol `BadNestedManagee' requires more powerful send semantics than its manager `BadNestedManager' provides + include protocol BadNestedManager; nested(upto inside_sync) async protocol BadNestedManagee { diff --git a/ipc/ipdl/test/ipdl/error/BadNestedManager.ipdl b/ipc/ipdl/test/ipdl/error/BadNestedManager.ipdl index 89fd15f7c086e..dd732fe4d94d7 100644 --- a/ipc/ipdl/test/ipdl/error/BadNestedManager.ipdl +++ b/ipc/ipdl/test/ipdl/error/BadNestedManager.ipdl @@ -1,3 +1,5 @@ +//error: protocol `BadNestedManagee' requires more powerful send semantics than its manager `BadNestedManager' provides + include protocol BadNestedManagee; nested(upto not) async protocol BadNestedManager { diff --git a/ipc/ipdl/test/ipdl/error/ForgottenManagee.ipdl b/ipc/ipdl/test/ipdl/error/ForgottenManagee.ipdl index 672ec87613095..35f6f02e4d6ac 100644 --- a/ipc/ipdl/test/ipdl/error/ForgottenManagee.ipdl +++ b/ipc/ipdl/test/ipdl/error/ForgottenManagee.ipdl @@ -1,3 +1,5 @@ +//error: |manager| declaration in protocol `ForgottenManagee' does not match any |manages| declaration in protocol `ManagerForgot' + include protocol ManagerForgot; // This protocol says ManagerForgot manages it, diff --git a/ipc/ipdl/test/ipdl/error/ForgottenManager.ipdl b/ipc/ipdl/test/ipdl/error/ForgottenManager.ipdl index ecee1d78f5278..4335dc8dc7719 100644 --- a/ipc/ipdl/test/ipdl/error/ForgottenManager.ipdl +++ b/ipc/ipdl/test/ipdl/error/ForgottenManager.ipdl @@ -1,3 +1,5 @@ +//error: |manages| declaration in protocol `ForgottenManager' does not match any |manager| declaration in protocol `ManageeForgot' + include protocol ManageeForgot; // ManageeForgot should have this protocol as its manager. diff --git a/ipc/ipdl/test/ipdl/error/InsideCpowToChild.ipdl b/ipc/ipdl/test/ipdl/error/InsideCpowToChild.ipdl index 499418c14f723..a28ab2c6d79d1 100644 --- a/ipc/ipdl/test/ipdl/error/InsideCpowToChild.ipdl +++ b/ipc/ipdl/test/ipdl/error/InsideCpowToChild.ipdl @@ -1,5 +1,8 @@ // inside_cpow nested parent-to-child messages are verboten +//error: inside_cpow nested parent-to-child messages are verboten (here, message `Msg' in protocol `InsideCpowToChild') +//error: message `Msg' requires more powerful send semantics than its protocol `InsideCpowToChild' provides + protocol InsideCpowToChild { child: nested(inside_cpow) sync Msg(); diff --git a/ipc/ipdl/test/ipdl/error/IntrAsyncManagee.ipdl b/ipc/ipdl/test/ipdl/error/IntrAsyncManagee.ipdl index aa86577f688d6..527c007ec47ee 100644 --- a/ipc/ipdl/test/ipdl/error/IntrAsyncManagee.ipdl +++ b/ipc/ipdl/test/ipdl/error/IntrAsyncManagee.ipdl @@ -1,3 +1,5 @@ +//error: protocol `IntrAsyncManagee' requires more powerful send semantics than its manager `IntrAsyncManager' provides + include protocol IntrAsyncManager; intr protocol IntrAsyncManagee { diff --git a/ipc/ipdl/test/ipdl/error/IntrAsyncManager.ipdl b/ipc/ipdl/test/ipdl/error/IntrAsyncManager.ipdl index 1589e51710c8d..7bf413ef6163d 100644 --- a/ipc/ipdl/test/ipdl/error/IntrAsyncManager.ipdl +++ b/ipc/ipdl/test/ipdl/error/IntrAsyncManager.ipdl @@ -1,3 +1,5 @@ +//error: protocol `IntrAsyncManagee' requires more powerful send semantics than its manager `IntrAsyncManager' provides + include protocol IntrAsyncManagee; async protocol IntrAsyncManager { diff --git a/ipc/ipdl/test/ipdl/error/IntrSyncManagee.ipdl b/ipc/ipdl/test/ipdl/error/IntrSyncManagee.ipdl index 9aca7374865f3..d0b1462e8647c 100644 --- a/ipc/ipdl/test/ipdl/error/IntrSyncManagee.ipdl +++ b/ipc/ipdl/test/ipdl/error/IntrSyncManagee.ipdl @@ -1,3 +1,5 @@ +//error: protocol `IntrSyncManagee' requires more powerful send semantics than its manager `IntrSyncManager' provides + include protocol IntrSyncManager; intr protocol IntrSyncManagee { diff --git a/ipc/ipdl/test/ipdl/error/IntrSyncManager.ipdl b/ipc/ipdl/test/ipdl/error/IntrSyncManager.ipdl index 206449ef1bee8..80a82ab6d8051 100644 --- a/ipc/ipdl/test/ipdl/error/IntrSyncManager.ipdl +++ b/ipc/ipdl/test/ipdl/error/IntrSyncManager.ipdl @@ -1,3 +1,5 @@ +//error: protocol `IntrSyncManagee' requires more powerful send semantics than its manager `IntrSyncManager' provides + include protocol IntrSyncManagee; sync protocol IntrSyncManager { diff --git a/ipc/ipdl/test/ipdl/error/ManageeForgot.ipdl b/ipc/ipdl/test/ipdl/error/ManageeForgot.ipdl index d81e1240c6dde..babe2f0658164 100644 --- a/ipc/ipdl/test/ipdl/error/ManageeForgot.ipdl +++ b/ipc/ipdl/test/ipdl/error/ManageeForgot.ipdl @@ -1,3 +1,5 @@ +//error: |manages| declaration in protocol `ForgottenManager' does not match any |manager| declaration in protocol `ManageeForgot' + include protocol ForgottenManager; // See ForgottenManager. This includes ForgottenManager to ensure that diff --git a/ipc/ipdl/test/ipdl/error/ManagerForgot.ipdl b/ipc/ipdl/test/ipdl/error/ManagerForgot.ipdl index 1bb5b3f662ad5..00c08ebe87ad3 100644 --- a/ipc/ipdl/test/ipdl/error/ManagerForgot.ipdl +++ b/ipc/ipdl/test/ipdl/error/ManagerForgot.ipdl @@ -1,3 +1,5 @@ +//error: |manager| declaration in protocol `ForgottenManagee' does not match any |manages| declaration in protocol `ManagerForgot' + include protocol ForgottenManagee; // See ForgottenManagee.ipdl. This includes ForgottenManagee to diff --git a/ipc/ipdl/test/ipdl/error/Nullable.ipdl b/ipc/ipdl/test/ipdl/error/Nullable.ipdl index cb7097f0e1523..93dfe1b461007 100644 --- a/ipc/ipdl/test/ipdl/error/Nullable.ipdl +++ b/ipc/ipdl/test/ipdl/error/Nullable.ipdl @@ -1,3 +1,5 @@ +//error: `nullable' qualifier for type `int' makes no sense + protocol Nullable { child: async Msg(nullable int i); diff --git a/ipc/ipdl/test/ipdl/error/Nullable2.ipdl b/ipc/ipdl/test/ipdl/error/Nullable2.ipdl index d572951aeab16..41c8b190b7941 100644 --- a/ipc/ipdl/test/ipdl/error/Nullable2.ipdl +++ b/ipc/ipdl/test/ipdl/error/Nullable2.ipdl @@ -1,3 +1,5 @@ +//error: `nullable' qualifier for type `int' makes no sense + union Union { nullable int; }; diff --git a/ipc/ipdl/test/ipdl/error/SyncAsyncManagee.ipdl b/ipc/ipdl/test/ipdl/error/SyncAsyncManagee.ipdl index d57b2e45658bb..166881ae1e3b3 100644 --- a/ipc/ipdl/test/ipdl/error/SyncAsyncManagee.ipdl +++ b/ipc/ipdl/test/ipdl/error/SyncAsyncManagee.ipdl @@ -1,3 +1,5 @@ +//error: protocol `SyncAsyncManagee' requires more powerful send semantics than its manager `SyncAsyncManager' provides + include protocol SyncAsyncManager; sync protocol SyncAsyncManagee { diff --git a/ipc/ipdl/test/ipdl/error/SyncAsyncManager.ipdl b/ipc/ipdl/test/ipdl/error/SyncAsyncManager.ipdl index 0f27b45152859..9dbc7a6318f7b 100644 --- a/ipc/ipdl/test/ipdl/error/SyncAsyncManager.ipdl +++ b/ipc/ipdl/test/ipdl/error/SyncAsyncManager.ipdl @@ -1,3 +1,5 @@ +//error: protocol `SyncAsyncManagee' requires more powerful send semantics than its manager `SyncAsyncManager' provides + include protocol SyncAsyncManagee; async protocol SyncAsyncManager { diff --git a/ipc/ipdl/test/ipdl/error/array_Recursive.ipdl b/ipc/ipdl/test/ipdl/error/array_Recursive.ipdl index 517cb66238e6a..f5027e229996f 100644 --- a/ipc/ipdl/test/ipdl/error/array_Recursive.ipdl +++ b/ipc/ipdl/test/ipdl/error/array_Recursive.ipdl @@ -1,3 +1,5 @@ +//error: bad syntax near `[' + protocol array_Recursive { child: async Msg(int[][] aa); }; diff --git a/ipc/ipdl/test/ipdl/error/asyncMessageListed.ipdl b/ipc/ipdl/test/ipdl/error/asyncMessageListed.ipdl index f732627875921..de22ad51b9c60 100644 --- a/ipc/ipdl/test/ipdl/error/asyncMessageListed.ipdl +++ b/ipc/ipdl/test/ipdl/error/asyncMessageListed.ipdl @@ -1,3 +1,5 @@ +//error: IPC message asyncMessageListed::Msg is async, can be delisted + protocol asyncMessageListed { parent: async Msg(); diff --git a/ipc/ipdl/test/ipdl/error/badProtocolInclude.ipdl b/ipc/ipdl/test/ipdl/error/badProtocolInclude.ipdl index cf310f34ff999..7a45d8066c99a 100644 --- a/ipc/ipdl/test/ipdl/error/badProtocolInclude.ipdl +++ b/ipc/ipdl/test/ipdl/error/badProtocolInclude.ipdl @@ -1,3 +1,5 @@ +//error: can't locate include file `IDONTEXIST.ipdl' + include protocol IDONTEXIST; // error: nonexistent protocol ^^^ diff --git a/ipc/ipdl/test/ipdl/error/compressCtor.ipdl b/ipc/ipdl/test/ipdl/error/compressCtor.ipdl index f1ea880b1d706..cc8d7e3d7c7d4 100644 --- a/ipc/ipdl/test/ipdl/error/compressCtor.ipdl +++ b/ipc/ipdl/test/ipdl/error/compressCtor.ipdl @@ -1,3 +1,6 @@ +//error: destructor messages can't use compression (here, in protocol `compressCtorManagee') +//error: constructor messages can't use compression (here, in protocol `compressCtor') + include protocol compressCtorManagee; intr protocol compressCtor { diff --git a/ipc/ipdl/test/ipdl/error/compressCtorManagee.ipdl b/ipc/ipdl/test/ipdl/error/compressCtorManagee.ipdl index 3d0c66c216276..23586fe104162 100644 --- a/ipc/ipdl/test/ipdl/error/compressCtorManagee.ipdl +++ b/ipc/ipdl/test/ipdl/error/compressCtorManagee.ipdl @@ -1,3 +1,6 @@ +//error: constructor messages can't use compression (here, in protocol `compressCtor') +//error: destructor messages can't use compression (here, in protocol `compressCtorManagee') + include protocol compressCtor; intr protocol compressCtorManagee { diff --git a/ipc/ipdl/test/ipdl/error/conflictProtocolMsg.ipdl b/ipc/ipdl/test/ipdl/error/conflictProtocolMsg.ipdl index 9699c3126eeff..b223dab78371b 100644 --- a/ipc/ipdl/test/ipdl/error/conflictProtocolMsg.ipdl +++ b/ipc/ipdl/test/ipdl/error/conflictProtocolMsg.ipdl @@ -1,3 +1,5 @@ +//error: ctor for protocol `conflictProtocolMsg', which is not managed by protocol `conflictProtocolMsg' + protocol conflictProtocolMsg { // it's an error to re-use the protocol name as a message ID; these diff --git a/ipc/ipdl/test/ipdl/error/cyclecheck_Child.ipdl b/ipc/ipdl/test/ipdl/error/cyclecheck_Child.ipdl index fbd524d527623..dd27586d8be98 100644 --- a/ipc/ipdl/test/ipdl/error/cyclecheck_Child.ipdl +++ b/ipc/ipdl/test/ipdl/error/cyclecheck_Child.ipdl @@ -1,3 +1,6 @@ +//error: cycle(s) detected in manager/manages hierarchy: `cyclecheck_Parent -> cyclecheck_Child -> cyclecheck_Grandchild -> cyclecheck_Parent' +//error: |manages| declaration in protocol `cyclecheck_Grandchild' does not match any |manager| declaration in protocol `cyclecheck_Parent' + include protocol cyclecheck_Parent; include protocol cyclecheck_Grandchild; diff --git a/ipc/ipdl/test/ipdl/error/cyclecheck_Grandchild.ipdl b/ipc/ipdl/test/ipdl/error/cyclecheck_Grandchild.ipdl index 7d8d95f4eab77..9152a56a1688d 100644 --- a/ipc/ipdl/test/ipdl/error/cyclecheck_Grandchild.ipdl +++ b/ipc/ipdl/test/ipdl/error/cyclecheck_Grandchild.ipdl @@ -1,3 +1,6 @@ +//error: cycle(s) detected in manager/manages hierarchy: `cyclecheck_Parent -> cyclecheck_Child -> cyclecheck_Grandchild -> cyclecheck_Parent' +//error: |manages| declaration in protocol `cyclecheck_Grandchild' does not match any |manager| declaration in protocol `cyclecheck_Parent' + include protocol cyclecheck_Child; include protocol cyclecheck_Parent; diff --git a/ipc/ipdl/test/ipdl/error/cyclecheck_Parent.ipdl b/ipc/ipdl/test/ipdl/error/cyclecheck_Parent.ipdl index cddf4020ea275..f2eb0606411f1 100644 --- a/ipc/ipdl/test/ipdl/error/cyclecheck_Parent.ipdl +++ b/ipc/ipdl/test/ipdl/error/cyclecheck_Parent.ipdl @@ -1,3 +1,5 @@ +//error: cycle(s) detected in manager/manages hierarchy: `cyclecheck_Parent -> cyclecheck_Child -> cyclecheck_Grandchild -> cyclecheck_Parent' + include protocol cyclecheck_Child; protocol cyclecheck_Parent { diff --git a/ipc/ipdl/test/ipdl/error/dtorReserved.ipdl b/ipc/ipdl/test/ipdl/error/dtorReserved.ipdl index c59987b9c50ab..51833489be2ca 100644 --- a/ipc/ipdl/test/ipdl/error/dtorReserved.ipdl +++ b/ipc/ipdl/test/ipdl/error/dtorReserved.ipdl @@ -1,3 +1,5 @@ +//error: lexically invalid characters `~SomeMsg(); + protocol dtorReserved { // it's an error to use old-style dtor syntax diff --git a/ipc/ipdl/test/ipdl/error/empty.ipdl b/ipc/ipdl/test/ipdl/error/empty.ipdl index 8b137891791fe..c6249c280b36a 100644 --- a/ipc/ipdl/test/ipdl/error/empty.ipdl +++ b/ipc/ipdl/test/ipdl/error/empty.ipdl @@ -1 +1 @@ - +//error: bad syntax near `???' \ No newline at end of file diff --git a/ipc/ipdl/test/ipdl/error/intrMessageCompress.ipdl b/ipc/ipdl/test/ipdl/error/intrMessageCompress.ipdl index dc0cdd80071cb..f76a0620df56a 100644 --- a/ipc/ipdl/test/ipdl/error/intrMessageCompress.ipdl +++ b/ipc/ipdl/test/ipdl/error/intrMessageCompress.ipdl @@ -1,3 +1,6 @@ +//error: message `foo' in protocol `intrMessageCompress' requests compression but is not async +//error: message `bar' in protocol `intrMessageCompress' requests compression but is not async + intr protocol intrMessageCompress { parent: intr foo() compress; diff --git a/ipc/ipdl/test/ipdl/error/lex1.ipdl b/ipc/ipdl/test/ipdl/error/lex1.ipdl index 0ab9e1e4f1155..a00629cbca41e 100644 --- a/ipc/ipdl/test/ipdl/error/lex1.ipdl +++ b/ipc/ipdl/test/ipdl/error/lex1.ipdl @@ -1 +1,2 @@ +//error: bad syntax near `slkdjfl' slkdjfl*&^* diff --git a/ipc/ipdl/test/ipdl/error/manageSelfToplevel.ipdl b/ipc/ipdl/test/ipdl/error/manageSelfToplevel.ipdl index 3770d6815f1f7..4540c2c2f6faf 100644 --- a/ipc/ipdl/test/ipdl/error/manageSelfToplevel.ipdl +++ b/ipc/ipdl/test/ipdl/error/manageSelfToplevel.ipdl @@ -1,3 +1,5 @@ +//error: top-level protocol `manageSelfToplevel' cannot manage itself + protocol manageSelfToplevel { manager manageSelfToplevel; manages manageSelfToplevel; diff --git a/ipc/ipdl/test/ipdl/error/managedNoCtor.ipdl b/ipc/ipdl/test/ipdl/error/managedNoCtor.ipdl index b7ded735a4a4e..fe59f1621a2d1 100644 --- a/ipc/ipdl/test/ipdl/error/managedNoCtor.ipdl +++ b/ipc/ipdl/test/ipdl/error/managedNoCtor.ipdl @@ -1,3 +1,5 @@ +//error: constructor declaration required for managed protocol `managedNoCtor' (managed by protocol `managerNoCtor') + include protocol managerNoCtor; protocol managedNoCtor { diff --git a/ipc/ipdl/test/ipdl/error/managedNoDtor.ipdl b/ipc/ipdl/test/ipdl/error/managedNoDtor.ipdl index 8d98018ee1b76..41bbd76689cb1 100644 --- a/ipc/ipdl/test/ipdl/error/managedNoDtor.ipdl +++ b/ipc/ipdl/test/ipdl/error/managedNoDtor.ipdl @@ -1,3 +1,4 @@ +//error: destructor declaration `__delete__(...)' required for managed protocol `managedNoDtor' include protocol managerNoDtor; protocol managedNoDtor { diff --git a/ipc/ipdl/test/ipdl/error/managerNoCtor.ipdl b/ipc/ipdl/test/ipdl/error/managerNoCtor.ipdl index d4f8cbacddb76..d67af4b468807 100644 --- a/ipc/ipdl/test/ipdl/error/managerNoCtor.ipdl +++ b/ipc/ipdl/test/ipdl/error/managerNoCtor.ipdl @@ -1,3 +1,5 @@ +//error: constructor declaration required for managed protocol `managedNoCtor' (managed by protocol `managerNoCtor') + include protocol managedNoCtor; protocol managerNoCtor { diff --git a/ipc/ipdl/test/ipdl/error/managerNoDtor.ipdl b/ipc/ipdl/test/ipdl/error/managerNoDtor.ipdl index 6fc7a32368a16..0417cc5ace464 100644 --- a/ipc/ipdl/test/ipdl/error/managerNoDtor.ipdl +++ b/ipc/ipdl/test/ipdl/error/managerNoDtor.ipdl @@ -1,3 +1,5 @@ +//error: destructor declaration `__delete__(...)' required for managed protocol `managedNoDtor' + include protocol managedNoDtor; protocol managerNoDtor { diff --git a/ipc/ipdl/test/ipdl/error/messageNoDirection.ipdl b/ipc/ipdl/test/ipdl/error/messageNoDirection.ipdl index a3d9585d4d13a..199bb089c3f1d 100644 --- a/ipc/ipdl/test/ipdl/error/messageNoDirection.ipdl +++ b/ipc/ipdl/test/ipdl/error/messageNoDirection.ipdl @@ -1,3 +1,5 @@ +//error: missing message direction + protocol messageNoDirection { async NoDirection(); }; diff --git a/ipc/ipdl/test/ipdl/error/multimanDupMgrs.ipdl b/ipc/ipdl/test/ipdl/error/multimanDupMgrs.ipdl index eb89f77d8073d..805a9f905eb73 100644 --- a/ipc/ipdl/test/ipdl/error/multimanDupMgrs.ipdl +++ b/ipc/ipdl/test/ipdl/error/multimanDupMgrs.ipdl @@ -1,3 +1,5 @@ +//error: manager `multimanDupMgrsMgr' appears multiple times + include protocol multimanDupMgrsMgr; protocol multimanDupMgrs { diff --git a/ipc/ipdl/test/ipdl/error/multimanDupMgrsMgr.ipdl b/ipc/ipdl/test/ipdl/error/multimanDupMgrsMgr.ipdl index 1d65d78277f0f..ff96fe91a3d32 100644 --- a/ipc/ipdl/test/ipdl/error/multimanDupMgrsMgr.ipdl +++ b/ipc/ipdl/test/ipdl/error/multimanDupMgrsMgr.ipdl @@ -1,3 +1,5 @@ +//error: manager `multimanDupMgrsMgr' appears multiple times + include protocol multimanDupMgrs; protocol multimanDupMgrsMgr { diff --git a/ipc/ipdl/test/ipdl/error/multimanNonexistentMgrs.ipdl b/ipc/ipdl/test/ipdl/error/multimanNonexistentMgrs.ipdl index 0d47612ebf6f3..24dafb816329b 100644 --- a/ipc/ipdl/test/ipdl/error/multimanNonexistentMgrs.ipdl +++ b/ipc/ipdl/test/ipdl/error/multimanNonexistentMgrs.ipdl @@ -1,3 +1,6 @@ +//error: protocol `Starsky' referenced as |manager| of `multimanNonexistentMgrs' has not been declared +//error: protocol `Hutch' referenced as |manager| of `multimanNonexistentMgrs' has not been declared + protocol multimanNonexistentMgrs { manager Starsky or Hutch; diff --git a/ipc/ipdl/test/ipdl/error/mutualRecStruct.ipdl b/ipc/ipdl/test/ipdl/error/mutualRecStruct.ipdl index fd4ee4d18df15..9df16543bf867 100644 --- a/ipc/ipdl/test/ipdl/error/mutualRecStruct.ipdl +++ b/ipc/ipdl/test/ipdl/error/mutualRecStruct.ipdl @@ -1,3 +1,7 @@ +//error: struct `X' is only partially defined +//error: struct `Y' is only partially defined +//error: struct `Z' is only partially defined + struct X { int i; Y[] y; diff --git a/ipc/ipdl/test/ipdl/error/mutualRecStructUnion.ipdl b/ipc/ipdl/test/ipdl/error/mutualRecStructUnion.ipdl index f475952d12bfa..cd193f9f295ed 100644 --- a/ipc/ipdl/test/ipdl/error/mutualRecStructUnion.ipdl +++ b/ipc/ipdl/test/ipdl/error/mutualRecStructUnion.ipdl @@ -1,3 +1,7 @@ +//error: struct `X' is only partially defined +//error: union `Y' is only partially defined +//error: struct `Z' is only partially defined + struct X { int i; Y[] y; diff --git a/ipc/ipdl/test/ipdl/error/noEmptyToplevel.ipdl b/ipc/ipdl/test/ipdl/error/noEmptyToplevel.ipdl index 08f13694e07fb..bc36cead42e4e 100644 --- a/ipc/ipdl/test/ipdl/error/noEmptyToplevel.ipdl +++ b/ipc/ipdl/test/ipdl/error/noEmptyToplevel.ipdl @@ -1,3 +1,5 @@ +//error: top-level protocol `noEmptyToplevel' cannot be empty + protocol noEmptyToplevel { // it's an error for top-level protocols to be empty diff --git a/ipc/ipdl/test/ipdl/error/noProtocolInHeader.ipdlh b/ipc/ipdl/test/ipdl/error/noProtocolInHeader.ipdlh index 958fe4e5230a7..8351adf4cc23f 100644 --- a/ipc/ipdl/test/ipdl/error/noProtocolInHeader.ipdlh +++ b/ipc/ipdl/test/ipdl/error/noProtocolInHeader.ipdlh @@ -1,3 +1,5 @@ +//error: can't define a protocol in a header. Do it in a protocol spec instead. + protocol noProtocolInHeader { child: async __delete__(); diff --git a/ipc/ipdl/test/ipdl/error/oldIncludeSyntax.ipdl b/ipc/ipdl/test/ipdl/error/oldIncludeSyntax.ipdl index 47acf04462e29..cb17c60a40bd0 100644 --- a/ipc/ipdl/test/ipdl/error/oldIncludeSyntax.ipdl +++ b/ipc/ipdl/test/ipdl/error/oldIncludeSyntax.ipdl @@ -1,3 +1,5 @@ +//error: bad syntax near `Foo.ipdl' + include protocol "Foo.ipdl"; protocol oldIncludeSyntax { diff --git a/ipc/ipdl/test/ipdl/error/parser.ipdl b/ipc/ipdl/test/ipdl/error/parser.ipdl index f3f273a0211c8..8bfd63546aa0a 100644 --- a/ipc/ipdl/test/ipdl/error/parser.ipdl +++ b/ipc/ipdl/test/ipdl/error/parser.ipdl @@ -1 +1,3 @@ +//error: bad syntax near `???' + protocol parser { diff --git a/ipc/ipdl/test/ipdl/error/redeclMessage.ipdl b/ipc/ipdl/test/ipdl/error/redeclMessage.ipdl index 5b2cdcf707719..1247aa41cfc1e 100644 --- a/ipc/ipdl/test/ipdl/error/redeclMessage.ipdl +++ b/ipc/ipdl/test/ipdl/error/redeclMessage.ipdl @@ -1,3 +1,6 @@ +//error: message name `Msg' already declared as `MessageType' +//error: redeclaration of symbol `Msg', first declared at + protocol redeclMessage { // can't declare two messages with the same name diff --git a/ipc/ipdl/test/ipdl/error/redeclParamReturn.ipdl b/ipc/ipdl/test/ipdl/error/redeclParamReturn.ipdl index 88b9fba035854..ccdcbbe0d13f0 100644 --- a/ipc/ipdl/test/ipdl/error/redeclParamReturn.ipdl +++ b/ipc/ipdl/test/ipdl/error/redeclParamReturn.ipdl @@ -1,3 +1,5 @@ +//error: redeclaration of symbol `f', first declared at + sync protocol redeclParamReturn { // it's an error to name a parameter with the same id as a return diff --git a/ipc/ipdl/test/ipdl/error/redeclScope.ipdlh b/ipc/ipdl/test/ipdl/error/redeclScope.ipdlh index 142299c61990e..a64439b599489 100644 --- a/ipc/ipdl/test/ipdl/error/redeclScope.ipdlh +++ b/ipc/ipdl/test/ipdl/error/redeclScope.ipdlh @@ -1,3 +1,5 @@ +//error: redeclaration of symbol `Foo', first declared at + struct Foo { bool b; }; diff --git a/ipc/ipdl/test/ipdl/error/shmem.ipdl b/ipc/ipdl/test/ipdl/error/shmem.ipdl index 03f85c39591dc..b2dda1adf7713 100644 --- a/ipc/ipdl/test/ipdl/error/shmem.ipdl +++ b/ipc/ipdl/test/ipdl/error/shmem.ipdl @@ -1,3 +1,6 @@ +//error: redeclaration of symbol `Shmem', first declared at +//error: redeclaration of symbol `mozilla::ipc::Shmem', first declared at + using class mozilla::ipc::Shmem from "mozilla/ipc/Shmem.h"; // redeclaration protocol shmem { diff --git a/ipc/ipdl/test/ipdl/error/structRedecl.ipdl b/ipc/ipdl/test/ipdl/error/structRedecl.ipdl index 521bc5acfa9e3..03a555787730d 100644 --- a/ipc/ipdl/test/ipdl/error/structRedecl.ipdl +++ b/ipc/ipdl/test/ipdl/error/structRedecl.ipdl @@ -1,3 +1,5 @@ +//error: redeclaration of symbol `a', first declared at + struct Redecl { int a; double a; diff --git a/ipc/ipdl/test/ipdl/error/structUnknownField.ipdl b/ipc/ipdl/test/ipdl/error/structUnknownField.ipdl index cba8604948df0..ac92edee234f0 100644 --- a/ipc/ipdl/test/ipdl/error/structUnknownField.ipdl +++ b/ipc/ipdl/test/ipdl/error/structUnknownField.ipdl @@ -1,3 +1,5 @@ +//error: field `i' of struct `S' has unknown type `Foobers' + struct S { Foobers i; }; diff --git a/ipc/ipdl/test/ipdl/error/syncMessageCompress.ipdl b/ipc/ipdl/test/ipdl/error/syncMessageCompress.ipdl index 73c92664e8ecc..72c9ef40eec92 100644 --- a/ipc/ipdl/test/ipdl/error/syncMessageCompress.ipdl +++ b/ipc/ipdl/test/ipdl/error/syncMessageCompress.ipdl @@ -1,3 +1,5 @@ +//error: message `foo' in protocol `syncMessageCompress' requests compression but is not async + sync protocol syncMessageCompress { parent: sync foo() compress; diff --git a/ipc/ipdl/test/ipdl/error/syncParentToChild.ipdl b/ipc/ipdl/test/ipdl/error/syncParentToChild.ipdl index f0d298fe555a3..bd6c8bc5b1dbc 100644 --- a/ipc/ipdl/test/ipdl/error/syncParentToChild.ipdl +++ b/ipc/ipdl/test/ipdl/error/syncParentToChild.ipdl @@ -1,3 +1,5 @@ +//error: sync parent-to-child messages are verboten (here, message `Msg' in protocol `syncParentToChild') + intr protocol syncParentToChild { // can't declare sync parent-to-child messages diff --git a/ipc/ipdl/test/ipdl/error/tooWeakIntrAsync.ipdl b/ipc/ipdl/test/ipdl/error/tooWeakIntrAsync.ipdl index 5289c46fd0bfd..b85b5af600615 100644 --- a/ipc/ipdl/test/ipdl/error/tooWeakIntrAsync.ipdl +++ b/ipc/ipdl/test/ipdl/error/tooWeakIntrAsync.ipdl @@ -1,3 +1,5 @@ +//error: message `Msg' requires more powerful send semantics than its protocol `tooWeakIntrAsync' provides + protocol tooWeakIntrAsync { // it's an error to declare an async protocol with an intr message diff --git a/ipc/ipdl/test/ipdl/error/tooWeakIntrSync.ipdl b/ipc/ipdl/test/ipdl/error/tooWeakIntrSync.ipdl index c87b0fd576ce9..9137586c90446 100644 --- a/ipc/ipdl/test/ipdl/error/tooWeakIntrSync.ipdl +++ b/ipc/ipdl/test/ipdl/error/tooWeakIntrSync.ipdl @@ -1,3 +1,5 @@ +//error: message `Msg' requires more powerful send semantics than its protocol `tooWeakIntrSync' provides + sync protocol tooWeakIntrSync { // it's an error to declare a sync protocol with an interrupt message diff --git a/ipc/ipdl/test/ipdl/error/tooWeakSyncAsync.ipdl b/ipc/ipdl/test/ipdl/error/tooWeakSyncAsync.ipdl index 2448a0cd9c4d0..49e4d3b75babc 100644 --- a/ipc/ipdl/test/ipdl/error/tooWeakSyncAsync.ipdl +++ b/ipc/ipdl/test/ipdl/error/tooWeakSyncAsync.ipdl @@ -1,3 +1,5 @@ +//error: message `Msg' requires more powerful send semantics than its protocol `tooWeakSyncAsync' provides + protocol tooWeakSyncAsync { // it's an error to declare an async protocol with a sync message diff --git a/ipc/ipdl/test/ipdl/error/twoprotocols.ipdl b/ipc/ipdl/test/ipdl/error/twoprotocols.ipdl index b9d3643a909a8..7e2a51a61aee2 100644 --- a/ipc/ipdl/test/ipdl/error/twoprotocols.ipdl +++ b/ipc/ipdl/test/ipdl/error/twoprotocols.ipdl @@ -1,5 +1,7 @@ // it's an error to define two protocols in the same file +//error: only one protocol definition per file + protocol p1 { child: async Msg(); }; diff --git a/ipc/ipdl/test/ipdl/error/undeclParamType.ipdl b/ipc/ipdl/test/ipdl/error/undeclParamType.ipdl index b075a97b906f0..3f93e747e1116 100644 --- a/ipc/ipdl/test/ipdl/error/undeclParamType.ipdl +++ b/ipc/ipdl/test/ipdl/error/undeclParamType.ipdl @@ -1,3 +1,5 @@ +//error: argument typename `FARGLEGARGLE' of message `Msg' has not been declared + protocol undeclParamType { child: async Msg(FARGLEGARGLE p); diff --git a/ipc/ipdl/test/ipdl/error/undeclProtocol.ipdl b/ipc/ipdl/test/ipdl/error/undeclProtocol.ipdl index f3a7d1e38f9b2..e171800201020 100644 --- a/ipc/ipdl/test/ipdl/error/undeclProtocol.ipdl +++ b/ipc/ipdl/test/ipdl/error/undeclProtocol.ipdl @@ -1,3 +1,6 @@ +//error: protocol `undeclared', managed by `undeclProtocol', has not been declared +//error: constructor declaration required for managed protocol `undeclared' (managed by protocol `undeclProtocol') + protocol undeclProtocol { manages undeclared; diff --git a/ipc/ipdl/test/ipdl/error/undeclReturnType.ipdl b/ipc/ipdl/test/ipdl/error/undeclReturnType.ipdl index b4bee83d10beb..2f353a1957d9a 100644 --- a/ipc/ipdl/test/ipdl/error/undeclReturnType.ipdl +++ b/ipc/ipdl/test/ipdl/error/undeclReturnType.ipdl @@ -1,3 +1,5 @@ +//error: argument typename `FARGLEGARGLE' of message `Msg' has not been declared + sync protocol undeclReturnType { child: sync Msg() returns (FARGLEGARGLE r); diff --git a/ipc/ipdl/test/ipdl/error/undefMutualRecStruct.ipdl b/ipc/ipdl/test/ipdl/error/undefMutualRecStruct.ipdl index e4e244550b25a..5ede1d82996bf 100644 --- a/ipc/ipdl/test/ipdl/error/undefMutualRecStruct.ipdl +++ b/ipc/ipdl/test/ipdl/error/undefMutualRecStruct.ipdl @@ -1,3 +1,7 @@ +//error: struct `X' is only partially defined +//error: struct `Y' is only partially defined +//error: struct `Z' is only partially defined + struct X { Y y; }; struct Y { Z z; }; struct Z { X x; }; diff --git a/ipc/ipdl/test/ipdl/error/undefMutualRecStructUnion.ipdl b/ipc/ipdl/test/ipdl/error/undefMutualRecStructUnion.ipdl index c5ed019a9d1f8..0e88c126e0e97 100644 --- a/ipc/ipdl/test/ipdl/error/undefMutualRecStructUnion.ipdl +++ b/ipc/ipdl/test/ipdl/error/undefMutualRecStructUnion.ipdl @@ -1,3 +1,7 @@ +//error: struct `X' is only partially defined +//error: union `Y' is only partially defined +//error: struct `Z' is only partially defined + struct X { Y y; }; union Y { Z; }; struct Z { X x; }; diff --git a/ipc/ipdl/test/ipdl/error/undefMutualRecUnion.ipdl b/ipc/ipdl/test/ipdl/error/undefMutualRecUnion.ipdl index 95292849fb0de..3fc99bbb95a52 100644 --- a/ipc/ipdl/test/ipdl/error/undefMutualRecUnion.ipdl +++ b/ipc/ipdl/test/ipdl/error/undefMutualRecUnion.ipdl @@ -1,3 +1,7 @@ +//error: union `X' is only partially defined +//error: union `Y' is only partially defined +//error: union `Z' is only partially defined + union X { Y; }; union Y { Z; }; union Z { X; }; diff --git a/ipc/ipdl/test/ipdl/error/undefSelfRecStruct.ipdl b/ipc/ipdl/test/ipdl/error/undefSelfRecStruct.ipdl index 7613a363fe1c2..15fc45abcd591 100644 --- a/ipc/ipdl/test/ipdl/error/undefSelfRecStruct.ipdl +++ b/ipc/ipdl/test/ipdl/error/undefSelfRecStruct.ipdl @@ -1,3 +1,5 @@ +//error: struct `X' is only partially defined + struct X { X x; }; protocol undefSelfRecStruct { diff --git a/ipc/ipdl/test/ipdl/error/undefSelfRecUnion.ipdl b/ipc/ipdl/test/ipdl/error/undefSelfRecUnion.ipdl index a2c40ecf0c1ff..951f916c57484 100644 --- a/ipc/ipdl/test/ipdl/error/undefSelfRecUnion.ipdl +++ b/ipc/ipdl/test/ipdl/error/undefSelfRecUnion.ipdl @@ -1,3 +1,5 @@ +//error: union `X' is only partially defined + union X { X; }; protocol undefSelfRecUnion { diff --git a/ipc/ipdl/test/ipdl/error/unknownIntrMessage.ipdl b/ipc/ipdl/test/ipdl/error/unknownIntrMessage.ipdl index a1a15bcb2e2b1..6d668f01ea35f 100644 --- a/ipc/ipdl/test/ipdl/error/unknownIntrMessage.ipdl +++ b/ipc/ipdl/test/ipdl/error/unknownIntrMessage.ipdl @@ -1,3 +1,5 @@ +//error: Unknown sync IPC message unknownIntrMessage::Msg + intr protocol unknownIntrMessage { parent: intr Msg(); diff --git a/ipc/ipdl/test/ipdl/error/unknownSyncMessage.ipdl b/ipc/ipdl/test/ipdl/error/unknownSyncMessage.ipdl index a4d340c2362de..be2cfad0cc881 100644 --- a/ipc/ipdl/test/ipdl/error/unknownSyncMessage.ipdl +++ b/ipc/ipdl/test/ipdl/error/unknownSyncMessage.ipdl @@ -1,3 +1,5 @@ +//error: Unknown sync IPC message unknownSyncMessage::Msg + sync protocol unknownSyncMessage { parent: sync Msg(); diff --git a/ipc/ipdl/test/ipdl/runtests.py b/ipc/ipdl/test/ipdl/runtests.py index 36c0d502c84b9..8e65f6837eb3a 100644 --- a/ipc/ipdl/test/ipdl/runtests.py +++ b/ipc/ipdl/test/ipdl/runtests.py @@ -14,6 +14,13 @@ def test(self): self.assertFalse(self.compile.exception(), self.mkFailMsg()) self.checkPassed() + def mkCustomMsg(self, msg): + return ''' +### Command: %s +### %s +### stderr: +%s''' % (' '.join(self.compile.argv), msg, self.compile.stderr) + def mkFailMsg(self): return ''' ### Command: %s @@ -42,8 +49,25 @@ class ErrorTestCase(IPDLTestCase): def __init__(self, ipdlargv, filename): IPDLTestCase.__init__(self, ipdlargv, filename) + # Look for expected errors in the input file. + f = open(filename, 'r') + self.expectedErrorMessage = [] + for l in f: + if l.startswith("//error:"): + self.expectedErrorMessage.append(l[2:-1]) + f.close() + + def checkPassed(self): - self.assertTrue(self.compile.error(), self.mkFailMsg()) + self.assertNotEqual(self.expectedErrorMessage, [], + self.mkCustomMsg("Error test should contain at least " + + "one line starting with //error: " + + "that indicates the expected failure.")) + + for e in self.expectedErrorMessage: + self.assertTrue(self.compile.error(e), + self.mkCustomMsg('Did not see expected error "' + + e + '"')) if __name__ == '__main__': From 937157112c16ce5801a07924b448ec9871fc4463 Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Wed, 22 Mar 2017 16:56:25 -0400 Subject: [PATCH 004/300] Bug 1343682 - Create temporary killswitch for preference reorg. r=mconley This uses the pref browser.preferences.useOldOrganization=true to use the old prefs. MozReview-Commit-ID: DQyHYSZJTKd --- browser/components/about/AboutRedirector.cpp | 12 + browser/components/about/AboutRedirector.h | 3 + .../preferences/in-content-old/advanced.js | 798 +++++++ .../preferences/in-content-old/advanced.xul | 436 ++++ .../in-content-old/applications.js | 1897 +++++++++++++++++ .../in-content-old/applications.xul | 95 + .../preferences/in-content-old/containers.js | 99 + .../preferences/in-content-old/containers.xul | 54 + .../preferences/in-content-old/content.js | 283 +++ .../preferences/in-content-old/content.xul | 207 ++ .../preferences/in-content-old/jar.mn | 18 + .../preferences/in-content-old/main.js | 699 ++++++ .../preferences/in-content-old/main.xul | 301 +++ .../preferences/in-content-old/moz.build | 13 + .../preferences/in-content-old/preferences.js | 313 +++ .../in-content-old/preferences.xul | 224 ++ .../preferences/in-content-old/privacy.js | 698 ++++++ .../preferences/in-content-old/privacy.xul | 311 +++ .../preferences/in-content-old/search.js | 604 ++++++ .../preferences/in-content-old/search.xul | 86 + .../preferences/in-content-old/security.js | 292 +++ .../preferences/in-content-old/security.xul | 131 ++ .../preferences/in-content-old/subdialogs.js | 438 ++++ .../preferences/in-content-old/sync.js | 492 +++++ .../preferences/in-content-old/sync.xul | 225 ++ .../in-content-old/tests/.eslintrc.js | 7 + .../in-content-old/tests/browser.ini | 47 + .../tests/browser_advanced_siteData.js | 649 ++++++ .../tests/browser_advanced_update.js | 155 ++ .../tests/browser_applications_selection.js | 79 + .../tests/browser_basic_rebuild_fonts_test.js | 76 + .../browser_bug1018066_resetScrollPosition.js | 24 + ...g1020245_openPreferences_to_paneContent.js | 41 + ...vent_scrolling_when_preferences_flipped.js | 95 + ...ent_scrolling_when_preferences_flipped.xul | 33 + .../in-content-old/tests/browser_bug410900.js | 46 + .../in-content-old/tests/browser_bug705422.js | 144 ++ .../in-content-old/tests/browser_bug731866.js | 52 + .../tests/browser_bug795764_cachedisabled.js | 52 + .../tests/browser_change_app_handler.js | 98 + .../tests/browser_connection.js | 99 + .../tests/browser_connection_bug388287.js | 125 ++ .../tests/browser_cookies_exceptions.js | 351 +++ .../browser_defaultbrowser_alwayscheck.js | 103 + .../tests/browser_healthreport.js | 62 + ...owser_homepages_filter_aboutpreferences.js | 20 + .../browser_notifications_do_not_disturb.js | 44 + .../browser_permissions_urlFieldHidden.js | 45 + .../tests/browser_privacypane_1.js | 19 + .../tests/browser_privacypane_3.js | 18 + .../tests/browser_privacypane_4.js | 26 + .../tests/browser_privacypane_5.js | 18 + .../tests/browser_privacypane_8.js | 27 + .../tests/browser_proxy_backup.js | 65 + .../browser_sanitizeOnShutdown_prefLocked.js | 39 + .../tests/browser_searchsuggestions.js | 43 + .../in-content-old/tests/browser_security.js | 130 ++ .../tests/browser_subdialogs.js | 292 +++ .../in-content-old/tests/browser_telemetry.js | 52 + .../preferences/in-content-old/tests/head.js | 192 ++ .../tests/privacypane_tests_perwindow.js | 333 +++ .../in-content-old/tests/site_data_test.html | 29 + .../in-content-old/tests/subdialog.xul | 27 + .../in-content-old/tests/subdialog2.xul | 27 + browser/components/preferences/moz.build | 8 +- browser/installer/allowed-dupes.mn | 11 + .../browser/preferences-old/advanced.dtd | 127 ++ .../preferences-old/applicationManager.dtd | 8 + .../applicationManager.properties | 14 + .../browser/preferences-old/applications.dtd | 14 + .../browser/preferences-old/blocklists.dtd | 14 + .../chrome/browser/preferences-old/colors.dtd | 30 + .../browser/preferences-old/connection.dtd | 49 + .../browser/preferences-old/containers.dtd | 26 + .../preferences-old/containers.properties | 24 + .../browser/preferences-old/content.dtd | 60 + .../browser/preferences-old/cookies.dtd | 28 + .../browser/preferences-old/donottrack.dtd | 13 + .../chrome/browser/preferences-old/fonts.dtd | 107 + .../browser/preferences-old/languages.dtd | 18 + .../chrome/browser/preferences-old/main.dtd | 45 + .../browser/preferences-old/permissions.dtd | 28 + .../browser/preferences-old/preferences.dtd | 29 + .../preferences-old/preferences.properties | 253 +++ .../browser/preferences-old/privacy.dtd | 113 + .../chrome/browser/preferences-old/search.dtd | 29 + .../browser/preferences-old/security.dtd | 40 + .../preferences-old/selectBookmark.dtd | 9 + .../preferences-old/siteDataSettings.dtd | 20 + .../chrome/browser/preferences-old/sync.dtd | 86 + .../chrome/browser/preferences-old/tabs.dtd | 22 + .../browser/preferences-old/translation.dtd | 24 + browser/locales/jar.mn | 50 +- 93 files changed, 13798 insertions(+), 14 deletions(-) create mode 100644 browser/components/preferences/in-content-old/advanced.js create mode 100644 browser/components/preferences/in-content-old/advanced.xul create mode 100644 browser/components/preferences/in-content-old/applications.js create mode 100644 browser/components/preferences/in-content-old/applications.xul create mode 100644 browser/components/preferences/in-content-old/containers.js create mode 100644 browser/components/preferences/in-content-old/containers.xul create mode 100644 browser/components/preferences/in-content-old/content.js create mode 100644 browser/components/preferences/in-content-old/content.xul create mode 100644 browser/components/preferences/in-content-old/jar.mn create mode 100644 browser/components/preferences/in-content-old/main.js create mode 100644 browser/components/preferences/in-content-old/main.xul create mode 100644 browser/components/preferences/in-content-old/moz.build create mode 100644 browser/components/preferences/in-content-old/preferences.js create mode 100644 browser/components/preferences/in-content-old/preferences.xul create mode 100644 browser/components/preferences/in-content-old/privacy.js create mode 100644 browser/components/preferences/in-content-old/privacy.xul create mode 100644 browser/components/preferences/in-content-old/search.js create mode 100644 browser/components/preferences/in-content-old/search.xul create mode 100644 browser/components/preferences/in-content-old/security.js create mode 100644 browser/components/preferences/in-content-old/security.xul create mode 100644 browser/components/preferences/in-content-old/subdialogs.js create mode 100644 browser/components/preferences/in-content-old/sync.js create mode 100755 browser/components/preferences/in-content-old/sync.xul create mode 100644 browser/components/preferences/in-content-old/tests/.eslintrc.js create mode 100644 browser/components/preferences/in-content-old/tests/browser.ini create mode 100644 browser/components/preferences/in-content-old/tests/browser_advanced_siteData.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_advanced_update.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_applications_selection.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_basic_rebuild_fonts_test.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1018066_resetScrollPosition.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1020245_openPreferences_to_paneContent.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.xul create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug410900.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug705422.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug731866.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug795764_cachedisabled.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_change_app_handler.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_connection.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_connection_bug388287.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_cookies_exceptions.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_defaultbrowser_alwayscheck.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_healthreport.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_homepages_filter_aboutpreferences.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_notifications_do_not_disturb.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_permissions_urlFieldHidden.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_1.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_3.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_4.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_5.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_8.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_proxy_backup.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_sanitizeOnShutdown_prefLocked.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_searchsuggestions.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_security.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_subdialogs.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_telemetry.js create mode 100644 browser/components/preferences/in-content-old/tests/head.js create mode 100644 browser/components/preferences/in-content-old/tests/privacypane_tests_perwindow.js create mode 100755 browser/components/preferences/in-content-old/tests/site_data_test.html create mode 100644 browser/components/preferences/in-content-old/tests/subdialog.xul create mode 100644 browser/components/preferences/in-content-old/tests/subdialog2.xul create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applications.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/colors.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/connection.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/containers.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/containers.properties create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/content.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/languages.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/main.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/preferences.properties create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/search.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/security.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/sync.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/translation.dtd diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp index 0d1c6ea5af239..b9de6a3187226 100644 --- a/browser/components/about/AboutRedirector.cpp +++ b/browser/components/about/AboutRedirector.cpp @@ -13,6 +13,7 @@ #include "nsIScriptSecurityManager.h" #include "nsIProtocolHandler.h" #include "mozilla/ArrayUtils.h" +#include "mozilla/Preferences.h" #include "nsServiceManagerUtils.h" namespace mozilla { @@ -20,6 +21,8 @@ namespace browser { NS_IMPL_ISUPPORTS(AboutRedirector, nsIAboutModule) +bool AboutRedirector::sUseOldPreferences = false; + struct RedirEntry { const char* id; const char* url; @@ -138,6 +141,13 @@ AboutRedirector::NewChannel(nsIURI* aURI, nsCOMPtr ioService = do_GetIOService(&rv); NS_ENSURE_SUCCESS(rv, rv); + static bool sPrefCacheInited = false; + if (!sPrefCacheInited) { + Preferences::AddBoolVarCache(&sUseOldPreferences, + "browser.preferences.useOldOrganization"); + sPrefCacheInited = true; + } + for (auto & redir : kRedirMap) { if (!strcmp(path.get(), redir.id)) { nsAutoCString url; @@ -149,6 +159,8 @@ AboutRedirector::NewChannel(nsIURI* aURI, NS_ENSURE_SUCCESS(rv, rv); rv = aboutNewTabService->GetDefaultURL(url); NS_ENSURE_SUCCESS(rv, rv); + } else if (path.EqualsLiteral("preferences") && sUseOldPreferences) { + url.AssignASCII("chrome://browser/content/preferences/in-content-old/preferences.xul"); } // fall back to the specified url in the map if (url.IsEmpty()) { diff --git a/browser/components/about/AboutRedirector.h b/browser/components/about/AboutRedirector.h index 8feeb74912e56..eaf25e3400a99 100644 --- a/browser/components/about/AboutRedirector.h +++ b/browser/components/about/AboutRedirector.h @@ -24,6 +24,9 @@ class AboutRedirector : public nsIAboutModule protected: virtual ~AboutRedirector() {} + +private: + static bool sUseOldPreferences; }; } // namespace browser diff --git a/browser/components/preferences/in-content-old/advanced.js b/browser/components/preferences/in-content-old/advanced.js new file mode 100644 index 0000000000000..bfd4505c6d6a8 --- /dev/null +++ b/browser/components/preferences/in-content-old/advanced.js @@ -0,0 +1,798 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* import-globals-from preferences.js */ + +// Load DownloadUtils module for convertByteUnits +Components.utils.import("resource://gre/modules/DownloadUtils.jsm"); +Components.utils.import("resource://gre/modules/LoadContextInfo.jsm"); +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "SiteDataManager", + "resource:///modules/SiteDataManager.jsm"); + +const PREF_UPLOAD_ENABLED = "datareporting.healthreport.uploadEnabled"; + +var gAdvancedPane = { + _inited: false, + + /** + * Brings the appropriate tab to the front and initializes various bits of UI. + */ + init() { + function setEventListener(aId, aEventType, aCallback) { + document.getElementById(aId) + .addEventListener(aEventType, aCallback.bind(gAdvancedPane)); + } + + this._inited = true; + var advancedPrefs = document.getElementById("advancedPrefs"); + + var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex"); + if (preference.value !== null) + advancedPrefs.selectedIndex = preference.value; + + if (AppConstants.MOZ_UPDATER) { + let onUnload = function() { + window.removeEventListener("unload", onUnload); + Services.prefs.removeObserver("app.update.", this); + }.bind(this); + window.addEventListener("unload", onUnload); + Services.prefs.addObserver("app.update.", this, false); + this.updateReadPrefs(); + } + this.updateOfflineApps(); + if (AppConstants.MOZ_CRASHREPORTER) { + this.initSubmitCrashes(); + } + this.initTelemetry(); + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + this.initSubmitHealthReport(); + } + this.updateOnScreenKeyboardVisibility(); + this.updateCacheSizeInputField(); + this.updateActualCacheSize(); + this.updateActualAppCacheSize(); + + if (Services.prefs.getBoolPref("browser.storageManager.enabled")) { + Services.obs.addObserver(this, "sitedatamanager:sites-updated", false); + let unload = () => { + window.removeEventListener("unload", unload); + Services.obs.removeObserver(this, "sitedatamanager:sites-updated"); + }; + window.addEventListener("unload", unload); + SiteDataManager.updateSites(); + setEventListener("clearSiteDataButton", "command", + gAdvancedPane.clearSiteData); + setEventListener("siteDataSettings", "command", + gAdvancedPane.showSiteDataSettings); + + let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "storage-permissions"; + document.getElementById("siteDataLearnMoreLink").setAttribute("href", url); + } + + setEventListener("layers.acceleration.disabled", "change", + gAdvancedPane.updateHardwareAcceleration); + setEventListener("advancedPrefs", "select", + gAdvancedPane.tabSelectionChanged); + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + setEventListener("submitHealthReportBox", "command", + gAdvancedPane.updateSubmitHealthReport); + } + + setEventListener("connectionSettings", "command", + gAdvancedPane.showConnections); + setEventListener("clearCacheButton", "command", + gAdvancedPane.clearCache); + setEventListener("clearOfflineAppCacheButton", "command", + gAdvancedPane.clearOfflineAppCache); + setEventListener("offlineNotifyExceptions", "command", + gAdvancedPane.showOfflineExceptions); + setEventListener("offlineAppsList", "select", + gAdvancedPane.offlineAppSelected); + let bundlePrefs = document.getElementById("bundlePreferences"); + document.getElementById("offlineAppsList") + .style.height = bundlePrefs.getString("offlineAppsList.height"); + setEventListener("offlineAppsListRemove", "command", + gAdvancedPane.removeOfflineApp); + if (AppConstants.MOZ_UPDATER) { + setEventListener("updateRadioGroup", "command", + gAdvancedPane.updateWritePrefs); + setEventListener("showUpdateHistory", "command", + gAdvancedPane.showUpdates); + } + setEventListener("viewCertificatesButton", "command", + gAdvancedPane.showCertificates); + setEventListener("viewSecurityDevicesButton", "command", + gAdvancedPane.showSecurityDevices); + setEventListener("cacheSize", "change", + gAdvancedPane.updateCacheSizePref); + + if (AppConstants.MOZ_WIDGET_GTK) { + // GTK tabbox' allow the scroll wheel to change the selected tab, + // but we don't want this behavior for the in-content preferences. + let tabsElement = document.getElementById("tabsElement"); + tabsElement.addEventListener("DOMMouseScroll", event => { + event.stopPropagation(); + }, true); + } + }, + + /** + * Stores the identity of the current tab in preferences so that the selected + * tab can be persisted between openings of the preferences window. + */ + tabSelectionChanged() { + if (!this._inited) + return; + var advancedPrefs = document.getElementById("advancedPrefs"); + var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex"); + + // tabSelectionChanged gets called twice due to the selectedIndex being set + // by both the selectedItem and selectedPanel callstacks. This guard is used + // to prevent double-counting in Telemetry. + if (preference.valueFromPreferences != advancedPrefs.selectedIndex) { + Services.telemetry + .getHistogramById("FX_PREFERENCES_CATEGORY_OPENED") + .add(telemetryBucketForCategory("advanced")); + } + + preference.valueFromPreferences = advancedPrefs.selectedIndex; + }, + + // GENERAL TAB + + /* + * Preferences: + * + * accessibility.browsewithcaret + * - true enables keyboard navigation and selection within web pages using a + * visible caret, false uses normal keyboard navigation with no caret + * accessibility.typeaheadfind + * - when set to true, typing outside text areas and input boxes will + * automatically start searching for what's typed within the current + * document; when set to false, no search action happens + * ui.osk.enabled + * - when set to true, subject to other conditions, we may sometimes invoke + * an on-screen keyboard when a text input is focused. + * (Currently Windows-only, and depending on prefs, may be Windows-8-only) + * general.autoScroll + * - when set to true, clicking the scroll wheel on the mouse activates a + * mouse mode where moving the mouse down scrolls the document downward with + * speed correlated with the distance of the cursor from the original + * position at which the click occurred (and likewise with movement upward); + * if false, this behavior is disabled + * general.smoothScroll + * - set to true to enable finer page scrolling than line-by-line on page-up, + * page-down, and other such page movements + * layout.spellcheckDefault + * - an integer: + * 0 disables spellchecking + * 1 enables spellchecking, but only for multiline text fields + * 2 enables spellchecking for all text fields + */ + + /** + * Stores the original value of the spellchecking preference to enable proper + * restoration if unchanged (since we're mapping a tristate onto a checkbox). + */ + _storedSpellCheck: 0, + + /** + * Returns true if any spellchecking is enabled and false otherwise, caching + * the current value to enable proper pref restoration if the checkbox is + * never changed. + */ + readCheckSpelling() { + var pref = document.getElementById("layout.spellcheckDefault"); + this._storedSpellCheck = pref.value; + + return (pref.value != 0); + }, + + /** + * Returns the value of the spellchecking preference represented by UI, + * preserving the preference's "hidden" value if the preference is + * unchanged and represents a value not strictly allowed in UI. + */ + writeCheckSpelling() { + var checkbox = document.getElementById("checkSpelling"); + if (checkbox.checked) { + if (this._storedSpellCheck == 2) { + return 2; + } + return 1; + } + return 0; + }, + + /** + * security.OCSP.enabled is an integer value for legacy reasons. + * A value of 1 means OCSP is enabled. Any other value means it is disabled. + */ + readEnableOCSP() { + var preference = document.getElementById("security.OCSP.enabled"); + // This is the case if the preference is the default value. + if (preference.value === undefined) { + return true; + } + return preference.value == 1; + }, + + /** + * See documentation for readEnableOCSP. + */ + writeEnableOCSP() { + var checkbox = document.getElementById("enableOCSP"); + return checkbox.checked ? 1 : 0; + }, + + /** + * When the user toggles the layers.acceleration.disabled pref, + * sync its new value to the gfx.direct2d.disabled pref too. + */ + updateHardwareAcceleration() { + if (AppConstants.platform == "win") { + var fromPref = document.getElementById("layers.acceleration.disabled"); + var toPref = document.getElementById("gfx.direct2d.disabled"); + toPref.value = fromPref.value; + } + }, + + // DATA CHOICES TAB + + /** + * Set up or hide the Learn More links for various data collection options + */ + _setupLearnMoreLink(pref, element) { + // set up the Learn More link with the correct URL + let url = Services.prefs.getCharPref(pref); + let el = document.getElementById(element); + + if (url) { + el.setAttribute("href", url); + } else { + el.setAttribute("hidden", "true"); + } + }, + + /** + * + */ + initSubmitCrashes() { + this._setupLearnMoreLink("toolkit.crashreporter.infoURL", + "crashReporterLearnMore"); + }, + + /** + * The preference/checkbox is configured in XUL. + * + * In all cases, set up the Learn More link sanely. + */ + initTelemetry() { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + this._setupLearnMoreLink("toolkit.telemetry.infoURL", "telemetryLearnMore"); + } + }, + + /** + * Set the status of the telemetry controls based on the input argument. + * @param {Boolean} aEnabled False disables the controls, true enables them. + */ + setTelemetrySectionEnabled(aEnabled) { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + // If FHR is disabled, additional data sharing should be disabled as well. + let disabled = !aEnabled; + document.getElementById("submitTelemetryBox").disabled = disabled; + if (disabled) { + // If we disable FHR, untick the telemetry checkbox. + Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); + } + document.getElementById("telemetryDataDesc").disabled = disabled; + } + }, + + /** + * Initialize the health report service reference and checkbox. + */ + initSubmitHealthReport() { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + this._setupLearnMoreLink("datareporting.healthreport.infoURL", "FHRLearnMore"); + + let checkbox = document.getElementById("submitHealthReportBox"); + + if (Services.prefs.prefIsLocked(PREF_UPLOAD_ENABLED)) { + checkbox.setAttribute("disabled", "true"); + return; + } + + checkbox.checked = Services.prefs.getBoolPref(PREF_UPLOAD_ENABLED); + this.setTelemetrySectionEnabled(checkbox.checked); + } + }, + + /** + * Update the health report preference with state from checkbox. + */ + updateSubmitHealthReport() { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + let checkbox = document.getElementById("submitHealthReportBox"); + Services.prefs.setBoolPref(PREF_UPLOAD_ENABLED, checkbox.checked); + this.setTelemetrySectionEnabled(checkbox.checked); + } + }, + + updateOnScreenKeyboardVisibility() { + if (AppConstants.platform == "win") { + let minVersion = Services.prefs.getBoolPref("ui.osk.require_win10") ? 10 : 6.2; + if (Services.vc.compare(Services.sysinfo.getProperty("version"), minVersion) >= 0) { + document.getElementById("useOnScreenKeyboard").hidden = false; + } + } + }, + + // NETWORK TAB + + /* + * Preferences: + * + * browser.cache.disk.capacity + * - the size of the browser cache in KB + * - Only used if browser.cache.disk.smart_size.enabled is disabled + */ + + /** + * Displays a dialog in which proxy settings may be changed. + */ + showConnections() { + gSubDialog.open("chrome://browser/content/preferences/connection.xul"); + }, + + showSiteDataSettings() { + gSubDialog.open("chrome://browser/content/preferences/siteDataSettings.xul"); + }, + + updateTotalSiteDataSize() { + SiteDataManager.getTotalUsage() + .then(usage => { + let size = DownloadUtils.convertByteUnits(usage); + let prefStrBundle = document.getElementById("bundlePreferences"); + let totalSiteDataSizeLabel = document.getElementById("totalSiteDataSize"); + totalSiteDataSizeLabel.textContent = prefStrBundle.getFormattedString("totalSiteDataSize", size); + let siteDataGroup = document.getElementById("siteDataGroup"); + siteDataGroup.hidden = false; + }); + }, + + // Retrieves the amount of space currently used by disk cache + updateActualCacheSize() { + var actualSizeLabel = document.getElementById("actualDiskCacheSize"); + var prefStrBundle = document.getElementById("bundlePreferences"); + + // Needs to root the observer since cache service keeps only a weak reference. + this.observer = { + onNetworkCacheDiskConsumption(consumption) { + var size = DownloadUtils.convertByteUnits(consumption); + // The XBL binding for the string bundle may have been destroyed if + // the page was closed before this callback was executed. + if (!prefStrBundle.getFormattedString) { + return; + } + actualSizeLabel.value = prefStrBundle.getFormattedString("actualDiskCacheSize", size); + }, + + QueryInterface: XPCOMUtils.generateQI([ + Components.interfaces.nsICacheStorageConsumptionObserver, + Components.interfaces.nsISupportsWeakReference + ]) + }; + + actualSizeLabel.value = prefStrBundle.getString("actualDiskCacheSizeCalculated"); + + try { + var cacheService = + Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] + .getService(Components.interfaces.nsICacheStorageService); + cacheService.asyncGetDiskConsumption(this.observer); + } catch (e) {} + }, + + // Retrieves the amount of space currently used by offline cache + updateActualAppCacheSize() { + var visitor = { + onCacheStorageInfo(aEntryCount, aConsumption, aCapacity, aDiskDirectory) { + var actualSizeLabel = document.getElementById("actualAppCacheSize"); + var sizeStrings = DownloadUtils.convertByteUnits(aConsumption); + var prefStrBundle = document.getElementById("bundlePreferences"); + // The XBL binding for the string bundle may have been destroyed if + // the page was closed before this callback was executed. + if (!prefStrBundle.getFormattedString) { + return; + } + var sizeStr = prefStrBundle.getFormattedString("actualAppCacheSize", sizeStrings); + actualSizeLabel.value = sizeStr; + } + }; + + try { + var cacheService = + Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] + .getService(Components.interfaces.nsICacheStorageService); + var storage = cacheService.appCacheStorage(LoadContextInfo.default, null); + storage.asyncVisitStorage(visitor, false); + } catch (e) {} + }, + + updateCacheSizeUI(smartSizeEnabled) { + document.getElementById("useCacheBefore").disabled = smartSizeEnabled; + document.getElementById("cacheSize").disabled = smartSizeEnabled; + document.getElementById("useCacheAfter").disabled = smartSizeEnabled; + }, + + readSmartSizeEnabled() { + // The smart_size.enabled preference element is inverted="true", so its + // value is the opposite of the actual pref value + var disabled = document.getElementById("browser.cache.disk.smart_size.enabled").value; + this.updateCacheSizeUI(!disabled); + }, + + /** + * Converts the cache size from units of KB to units of MB and stores it in + * the textbox element. + */ + updateCacheSizeInputField() { + let cacheSizeElem = document.getElementById("cacheSize"); + let cachePref = document.getElementById("browser.cache.disk.capacity"); + cacheSizeElem.value = cachePref.value / 1024; + if (cachePref.locked) + cacheSizeElem.disabled = true; + }, + + /** + * Updates the cache size preference once user enters a new value. + * We intentionally do not set preference="browser.cache.disk.capacity" + * onto the textbox directly, as that would update the pref at each keypress + * not only after the final value is entered. + */ + updateCacheSizePref() { + let cacheSizeElem = document.getElementById("cacheSize"); + let cachePref = document.getElementById("browser.cache.disk.capacity"); + // Converts the cache size as specified in UI (in MB) to KB. + let intValue = parseInt(cacheSizeElem.value, 10); + cachePref.value = isNaN(intValue) ? 0 : intValue * 1024; + }, + + /** + * Clears the cache. + */ + clearCache() { + try { + var cache = Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] + .getService(Components.interfaces.nsICacheStorageService); + cache.clear(); + } catch (ex) {} + this.updateActualCacheSize(); + }, + + /** + * Clears the application cache. + */ + clearOfflineAppCache() { + Components.utils.import("resource:///modules/offlineAppCache.jsm"); + OfflineAppCacheHelper.clear(); + + this.updateActualAppCacheSize(); + this.updateOfflineApps(); + }, + + clearSiteData() { + let flags = + Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 + + Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1 + + Services.prompt.BUTTON_POS_0_DEFAULT; + let prefStrBundle = document.getElementById("bundlePreferences"); + let title = prefStrBundle.getString("clearSiteDataPromptTitle"); + let text = prefStrBundle.getString("clearSiteDataPromptText"); + let btn0Label = prefStrBundle.getString("clearSiteDataNow"); + + let result = Services.prompt.confirmEx( + window, title, text, flags, btn0Label, null, null, null, {}); + if (result == 0) { + SiteDataManager.removeAll(); + } + }, + + readOfflineNotify() { + var pref = document.getElementById("browser.offline-apps.notify"); + var button = document.getElementById("offlineNotifyExceptions"); + button.disabled = !pref.value; + return pref.value; + }, + + showOfflineExceptions() { + var bundlePreferences = document.getElementById("bundlePreferences"); + var params = { blockVisible: false, + sessionVisible: false, + allowVisible: false, + prefilledHost: "", + permissionType: "offline-app", + manageCapability: Components.interfaces.nsIPermissionManager.DENY_ACTION, + windowTitle: bundlePreferences.getString("offlinepermissionstitle"), + introText: bundlePreferences.getString("offlinepermissionstext") }; + gSubDialog.open("chrome://browser/content/preferences/permissions.xul", + null, params); + }, + + // XXX: duplicated in browser.js + _getOfflineAppUsage(perm, groups) { + let cacheService = Cc["@mozilla.org/network/application-cache-service;1"]. + getService(Ci.nsIApplicationCacheService); + if (!groups) { + try { + groups = cacheService.getGroups(); + } catch (ex) { + return 0; + } + } + + let usage = 0; + for (let group of groups) { + let uri = Services.io.newURI(group); + if (perm.matchesURI(uri, true)) { + let cache = cacheService.getActiveCache(group); + usage += cache.usage; + } + } + + return usage; + }, + + /** + * Updates the list of offline applications + */ + updateOfflineApps() { + var pm = Components.classes["@mozilla.org/permissionmanager;1"] + .getService(Components.interfaces.nsIPermissionManager); + + var list = document.getElementById("offlineAppsList"); + while (list.firstChild) { + list.firstChild.remove(); + } + + var groups; + try { + var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"]. + getService(Components.interfaces.nsIApplicationCacheService); + groups = cacheService.getGroups(); + } catch (e) { + return; + } + + var bundle = document.getElementById("bundlePreferences"); + + var enumerator = pm.enumerator; + while (enumerator.hasMoreElements()) { + var perm = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission); + if (perm.type == "offline-app" && + perm.capability != Components.interfaces.nsIPermissionManager.DEFAULT_ACTION && + perm.capability != Components.interfaces.nsIPermissionManager.DENY_ACTION) { + var row = document.createElement("listitem"); + row.id = ""; + row.className = "offlineapp"; + row.setAttribute("origin", perm.principal.origin); + var converted = DownloadUtils. + convertByteUnits(this._getOfflineAppUsage(perm, groups)); + row.setAttribute("usage", + bundle.getFormattedString("offlineAppUsage", + converted)); + list.appendChild(row); + } + } + }, + + offlineAppSelected() { + var removeButton = document.getElementById("offlineAppsListRemove"); + var list = document.getElementById("offlineAppsList"); + if (list.selectedItem) { + removeButton.setAttribute("disabled", "false"); + } else { + removeButton.setAttribute("disabled", "true"); + } + }, + + removeOfflineApp() { + var list = document.getElementById("offlineAppsList"); + var item = list.selectedItem; + var origin = item.getAttribute("origin"); + var principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin); + + var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] + .getService(Components.interfaces.nsIPromptService); + var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 + + prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1; + + var bundle = document.getElementById("bundlePreferences"); + var title = bundle.getString("offlineAppRemoveTitle"); + var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [principal.URI.prePath]); + var confirm = bundle.getString("offlineAppRemoveConfirm"); + var result = prompts.confirmEx(window, title, prompt, flags, confirm, + null, null, null, {}); + if (result != 0) + return; + + // get the permission + var pm = Components.classes["@mozilla.org/permissionmanager;1"] + .getService(Components.interfaces.nsIPermissionManager); + var perm = pm.getPermissionObject(principal, "offline-app", true); + if (perm) { + // clear offline cache entries + try { + var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"]. + getService(Components.interfaces.nsIApplicationCacheService); + var groups = cacheService.getGroups(); + for (var i = 0; i < groups.length; i++) { + var uri = Services.io.newURI(groups[i]); + if (perm.matchesURI(uri, true)) { + var cache = cacheService.getActiveCache(groups[i]); + cache.discard(); + } + } + } catch (e) {} + + pm.removePermission(perm); + } + list.removeChild(item); + gAdvancedPane.offlineAppSelected(); + this.updateActualAppCacheSize(); + }, + + // UPDATE TAB + + /* + * Preferences: + * + * app.update.enabled + * - true if updates to the application are enabled, false otherwise + * app.update.auto + * - true if updates should be automatically downloaded and installed and + * false if the user should be asked what he wants to do when an update is + * available + * extensions.update.enabled + * - true if updates to extensions and themes are enabled, false otherwise + * browser.search.update + * - true if updates to search engines are enabled, false otherwise + */ + + /** + * Selects the item of the radiogroup based on the pref values and locked + * states. + * + * UI state matrix for update preference conditions + * + * UI Components: Preferences + * Radiogroup i = app.update.enabled + * ii = app.update.auto + * + * Disabled states: + * Element pref value locked disabled + * radiogroup i t/f f false + * i t/f *t* *true* + * ii t/f f false + * ii t/f *t* *true* + */ + updateReadPrefs() { + if (AppConstants.MOZ_UPDATER) { + var enabledPref = document.getElementById("app.update.enabled"); + var autoPref = document.getElementById("app.update.auto"); + var radiogroup = document.getElementById("updateRadioGroup"); + + if (!enabledPref.value) // Don't care for autoPref.value in this case. + radiogroup.value = "manual"; // 3. Never check for updates. + else if (autoPref.value) // enabledPref.value && autoPref.value + radiogroup.value = "auto"; // 1. Automatically install updates + else // enabledPref.value && !autoPref.value + radiogroup.value = "checkOnly"; // 2. Check, but let me choose + + var canCheck = Components.classes["@mozilla.org/updates/update-service;1"]. + getService(Components.interfaces.nsIApplicationUpdateService). + canCheckForUpdates; + // canCheck is false if the enabledPref is false and locked, + // or the binary platform or OS version is not known. + // A locked pref is sufficient to disable the radiogroup. + radiogroup.disabled = !canCheck || enabledPref.locked || autoPref.locked; + + if (AppConstants.MOZ_MAINTENANCE_SERVICE) { + // Check to see if the maintenance service is installed. + // If it is don't show the preference at all. + var installed; + try { + var wrk = Components.classes["@mozilla.org/windows-registry-key;1"] + .createInstance(Components.interfaces.nsIWindowsRegKey); + wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE, + "SOFTWARE\\Mozilla\\MaintenanceService", + wrk.ACCESS_READ | wrk.WOW64_64); + installed = wrk.readIntValue("Installed"); + wrk.close(); + } catch (e) { + } + if (installed != 1) { + document.getElementById("useService").hidden = true; + } + } + } + }, + + /** + * Sets the pref values based on the selected item of the radiogroup. + */ + updateWritePrefs() { + if (AppConstants.MOZ_UPDATER) { + var enabledPref = document.getElementById("app.update.enabled"); + var autoPref = document.getElementById("app.update.auto"); + var radiogroup = document.getElementById("updateRadioGroup"); + switch (radiogroup.value) { + case "auto": // 1. Automatically install updates for Desktop only + enabledPref.value = true; + autoPref.value = true; + break; + case "checkOnly": // 2. Check, but let me choose + enabledPref.value = true; + autoPref.value = false; + break; + case "manual": // 3. Never check for updates. + enabledPref.value = false; + autoPref.value = false; + } + } + }, + + /** + * Displays the history of installed updates. + */ + showUpdates() { + gSubDialog.open("chrome://mozapps/content/update/history.xul"); + }, + + // ENCRYPTION TAB + + /* + * Preferences: + * + * security.default_personal_cert + * - a string: + * "Select Automatically" select a certificate automatically when a site + * requests one + * "Ask Every Time" present a dialog to the user so he can select + * the certificate to use on a site which + * requests one + */ + + /** + * Displays the user's certificates and associated options. + */ + showCertificates() { + gSubDialog.open("chrome://pippki/content/certManager.xul"); + }, + + /** + * Displays a dialog from which the user can manage his security devices. + */ + showSecurityDevices() { + gSubDialog.open("chrome://pippki/content/device_manager.xul"); + }, + + observe(aSubject, aTopic, aData) { + if (AppConstants.MOZ_UPDATER) { + switch (aTopic) { + case "nsPref:changed": + this.updateReadPrefs(); + break; + + case "sitedatamanager:sites-updated": + this.updateTotalSiteDataSize(); + break; + } + } + }, +}; diff --git a/browser/components/preferences/in-content-old/advanced.xul b/browser/components/preferences/in-content-old/advanced.xul new file mode 100644 index 0000000000000..523211ec74f2e --- /dev/null +++ b/browser/components/preferences/in-content-old/advanced.xul @@ -0,0 +1,436 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + + + + + +

Site Data Test

+ + + diff --git a/browser/components/preferences/in-content-old/tests/subdialog.xul b/browser/components/preferences/in-content-old/tests/subdialog.xul new file mode 100644 index 0000000000000..48d297b7373b2 --- /dev/null +++ b/browser/components/preferences/in-content-old/tests/subdialog.xul @@ -0,0 +1,27 @@ + + + + + + + + + + A sample sub-dialog for testing + + + + + + diff --git a/browser/components/preferences/in-content-old/tests/subdialog2.xul b/browser/components/preferences/in-content-old/tests/subdialog2.xul new file mode 100644 index 0000000000000..89803c2503baf --- /dev/null +++ b/browser/components/preferences/in-content-old/tests/subdialog2.xul @@ -0,0 +1,27 @@ + + + + + + + + + + A sample sub-dialog for testing + + + + + + diff --git a/browser/components/preferences/moz.build b/browser/components/preferences/moz.build index 49efefa37306f..ae79e6bf4e58b 100644 --- a/browser/components/preferences/moz.build +++ b/browser/components/preferences/moz.build @@ -4,10 +4,14 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -DIRS += ['in-content'] +DIRS += [ + 'in-content-old', + 'in-content' +] BROWSER_CHROME_MANIFESTS += [ - 'in-content/tests/browser.ini', + 'in-content-old/tests/browser.ini', + 'in-content/tests/browser.ini' ] for var in ('MOZ_APP_NAME', 'MOZ_MACBUNDLE_NAME'): diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn index 85853adef06ea..43e95b84a3ae4 100644 --- a/browser/installer/allowed-dupes.mn +++ b/browser/installer/allowed-dupes.mn @@ -10,6 +10,17 @@ LaunchServices/org.mozilla.updater updater.app/Contents/MacOS/org.mozilla.updater updater.app/Contents/PkgInfo browser/chrome.manifest +# browser preferences fork is bug 1349689 +browser/chrome/browser/content/preferences/in-content-old/advanced.js +browser/chrome/browser/content/preferences/in-content-old/applications.js +browser/chrome/browser/content/preferences/in-content-old/containers.js +browser/chrome/browser/content/preferences/in-content-old/content.js +browser/chrome/browser/content/preferences/in-content-old/main.js +browser/chrome/browser/content/preferences/in-content-old/preferences.js +browser/chrome/browser/content/preferences/in-content-old/privacy.js +browser/chrome/browser/content/preferences/in-content-old/search.js +browser/chrome/browser/content/preferences/in-content-old/security.js +browser/chrome/browser/content/preferences/in-content-old/sync.js # browser branding / themes is bug 1313106 browser/chrome/browser/content/branding/icon128.png browser/chrome/browser/content/branding/icon16.png diff --git a/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd b/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd new file mode 100644 index 0000000000000..4bf2723c434a2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd new file mode 100644 index 0000000000000..d2c76e63d7717 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd @@ -0,0 +1,8 @@ + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties new file mode 100644 index 0000000000000..335363a662cfe --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties @@ -0,0 +1,14 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# LOCALIZATION NOTE +# in descriptionApplications, %S will be replaced by one of the 3 following strings +descriptionApplications=The following applications can be used to handle %S. + +handleProtocol=%S links +handleWebFeeds=Web Feeds +handleFile=%S content + +descriptionWebApp=This web application is hosted at: +descriptionLocalApp=This application is located at: diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd b/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd new file mode 100644 index 0000000000000..ea89c3124466c --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd b/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd new file mode 100644 index 0000000000000..31a2986fe4570 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd b/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd new file mode 100644 index 0000000000000..153f68d7c90cd --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd b/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd new file mode 100644 index 0000000000000..850964a0fa7c2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd b/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd new file mode 100644 index 0000000000000..d715813548c5a --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/containers.properties b/browser/locales/en-US/chrome/browser/preferences-old/containers.properties new file mode 100644 index 0000000000000..6b78a9263fca2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/containers.properties @@ -0,0 +1,24 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +containers.labelMinWidth = 4rem +containers.updateContainerTitle = %S Container Preferences + +containers.blue.label = Blue +containers.turquoise.label = Turquoise +containers.green.label = Green +containers.yellow.label = Yellow +containers.orange.label = Orange +containers.red.label = Red +containers.pink.label = Pink +containers.purple.label = Purple + +containers.fingerprint.label = Fingerprint +containers.briefcase.label = Briefcase +# LOCALIZATION NOTE (containers.dollar.label) +# String represents a money sign but currently uses a dollar sign so don't change to local currency +# See Bug 1291672 +containers.dollar.label = Dollar sign +containers.cart.label = Shopping cart +containers.circle.label = Dot diff --git a/browser/locales/en-US/chrome/browser/preferences-old/content.dtd b/browser/locales/en-US/chrome/browser/preferences-old/content.dtd new file mode 100644 index 0000000000000..c0d1c9f311dce --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/content.dtd @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd b/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd new file mode 100644 index 0000000000000..e4d3a9b9ca70c --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd b/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd new file mode 100644 index 0000000000000..781fb53cd5b78 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd b/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd new file mode 100644 index 0000000000000..cdf5c2ba786db --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd b/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd new file mode 100644 index 0000000000000..ba5b11eb5fc19 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/main.dtd b/browser/locales/en-US/chrome/browser/preferences-old/main.dtd new file mode 100644 index 0000000000000..3085ffd0deadb --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/main.dtd @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd b/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd new file mode 100644 index 0000000000000..e61228b76d156 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd b/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd new file mode 100644 index 0000000000000..380da71783630 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties b/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties new file mode 100644 index 0000000000000..2f2e1ab34929f --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties @@ -0,0 +1,253 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#### Security + +# LOCALIZATION NOTE: phishBefore uses %S to represent the name of the provider +# whose privacy policy must be accepted (for enabling +# check-every-page-as-I-load-it phishing protection). +phishBeforeText=Selecting this option will send the address of web pages you are viewing to %S. To continue, please review and accept the following terms of service. + +#### Fonts + +labelDefaultFont=Default (%S) + +veryLargeMinimumFontTitle=Large minimum font size +veryLargeMinimumFontWarning=You have selected a very large minimum font size (more than 24 pixels). This may make it difficult or impossible to use some important configuration pages like this one. +acceptVeryLargeMinimumFont=Keep my changes anyway + +#### Permissions Manager + +trackingprotectionpermissionstext=You have disabled Tracking Protection on these sites. +trackingprotectionpermissionstitle=Exceptions - Tracking Protection +cookiepermissionstext=You can specify which websites are always or never allowed to use cookies. Type the exact address of the site you want to manage and then click Block, Allow for Session, or Allow. +cookiepermissionstitle=Exceptions - Cookies +addonspermissionstext=You can specify which websites are allowed to install add-ons. Type the exact address of the site you want to allow and then click Allow. +addons_permissions_title=Allowed Sites - Add-ons Installation +popuppermissionstext=You can specify which websites are allowed to open pop-up windows. Type the exact address of the site you want to allow and then click Allow. +popuppermissionstitle=Allowed Sites - Pop-ups +notificationspermissionstext4=Control which websites are always or never allowed to send you notifications. If you remove a site, it will need to request permission again. +notificationspermissionstitle=Notification Permissions +invalidURI=Please enter a valid hostname +invalidURITitle=Invalid Hostname Entered +savedLoginsExceptions_title=Exceptions - Saved Logins +savedLoginsExceptions_desc=Logins for the following sites will not be saved: + +#### Block List Manager + +blockliststext=You can choose which list Firefox will use to block Web elements that may track your browsing activity. +blockliststitle=Block Lists +# LOCALIZATION NOTE (mozNameTemplate): This template constructs the name of the +# block list in the block lists dialog. It combines the list name and +# description. +# e.g. mozNameTemplate : "Standard (Recommended). This list does a pretty good job." +# %1$S = list name (fooName), %2$S = list descriptive text (fooDesc) +mozNameTemplate=%1$S %2$S +# LOCALIZATION NOTE (mozstdName, etc.): These labels appear in the tracking +# protection block lists dialog, mozNameTemplate is used to create the final +# string. Note that in the future these two strings (name, desc) could be +# displayed on two different lines. +mozstdName=Disconnect.me basic protection (Recommended). +mozstdDesc=Allows some trackers so websites function properly. +mozfullName=Disconnect.me strict protection. +mozfullDesc=Blocks known trackers. Some sites may not function properly. +# LOCALIZATION NOTE (blocklistChangeRequiresRestart): %S = brandShortName +blocklistChangeRequiresRestart=%S must restart to change block lists. + +#### Master Password + +pw_change2empty_in_fips_mode=You are currently in FIPS mode. FIPS requires a non-empty Master Password. +pw_change_failed_title=Password Change Failed + +#### Fonts + +# LOCALIZATION NOTE: Next two strings are for language name representations with +# and without the region. +# e.g. languageRegionCodeFormat : "French/Canada [fr-ca]" languageCodeFormat : "French [fr]" +# %1$S = language name, %2$S = region name, %3$S = language-region code +languageRegionCodeFormat=%1$S/%2$S [%3$S] +# %1$S = language name, %2$S = language-region code +languageCodeFormat=%1$S [%2$S] + +#### Downloads + +desktopFolderName=Desktop +downloadsFolderName=Downloads +chooseDownloadFolderTitle=Choose Download Folder: + +#### Applications + +fileEnding=%S file +saveFile=Save File + +# LOCALIZATION NOTE (useApp, useDefault): %S = Application name +useApp=Use %S +useDefault=Use %S (default) + +useOtherApp=Use other… +fpTitleChooseApp=Select Helper Application +manageApp=Application Details… +webFeed=Web Feed +videoPodcastFeed=Video Podcast +audioPodcastFeed=Podcast +alwaysAsk=Always ask +portableDocumentFormat=Portable Document Format (PDF) + +# LOCALIZATION NOTE (usePluginIn): +# %1$S = plugin name (for example "QuickTime Plugin-in 7.2") +# %2$S = brandShortName from brand.properties (for example "Minefield") +usePluginIn=Use %S (in %S) + +# LOCALIZATION NOTE (previewInApp, addLiveBookmarksInApp): %S = brandShortName +previewInApp=Preview in %S +addLiveBookmarksInApp=Add Live Bookmarks in %S + +# LOCALIZATION NOTE (typeDescriptionWithType): +# %1$S = type description (for example "Portable Document Format") +# %2$S = type (for example "application/pdf") +typeDescriptionWithType=%S (%S) + + +#### Cookie Viewer + +hostColon=Host: +domainColon=Domain: +forSecureOnly=Encrypted connections only +forAnyConnection=Any type of connection +expireAtEndOfSession=At end of session +can=Allow +canAccessFirstParty=Allow first party only +canSession=Allow for Session +cannot=Block +noCookieSelected= +cookiesAll=The following cookies are stored on your computer: +cookiesFiltered=The following cookies match your search: + +# LOCALIZATION NOTE (removeAllCookies, removeAllShownCookies): +# removeAllCookies and removeAllShownCookies are both used on the same one button, +# never displayed together and can share the same accesskey. +# When only partial cookies are shown as a result of keyword search, +# removeAllShownCookies is displayed as button label. +# removeAllCookies is displayed when no keyword search and all cookies are shown. +removeAllCookies.label=Remove All +removeAllCookies.accesskey=A +removeAllShownCookies.label=Remove All Shown +removeAllShownCookies.accesskey=A + +# LOCALIZATION NOTE (removeSelectedCookies): +# Semicolon-separated list of plural forms. See: +# http://developer.mozilla.org/en/docs/Localization_and_Plurals +# If you need to display the number of selected elements in your language, +# you can use #1 in your localization as a placeholder for the number. +# For example this is the English string with numbers: +# removeSelectedCookied=Remove #1 Selected;Remove #1 Selected +removeSelectedCookies.label=Remove Selected;Remove Selected +removeSelectedCookies.accesskey=R + +defaultUserContextLabel=None + +#### Offline apps +offlineAppsList.height=7em +offlineAppRemoveTitle=Remove offline website data +offlineAppRemovePrompt=After removing this data, %S will not be available offline. Are you sure you want to remove this offline website? +offlineAppRemoveConfirm=Remove offline data + +# LOCALIZATION NOTE: The next string is for the disk usage of the +# offline application +# e.g. offlineAppUsage : "50.23 MB" +# %1$S = size (in bytes or megabytes, ...) +# %2$S = unit of measure (bytes, KB, MB, ...) +offlineAppUsage=%1$S %2$S + +offlinepermissionstext=The following websites are not allowed to store data for offline use: +offlinepermissionstitle=Offline Data + +####Preferences::Advanced::Network +#LOCALIZATION NOTE: The next string is for the disk usage of the web content cache. +# e.g., "Your web content cache is currently using 200 MB" +# %1$S = size +# %2$S = unit (MB, KB, etc.) +actualDiskCacheSize=Your web content cache is currently using %1$S %2$S of disk space +actualDiskCacheSizeCalculated=Calculating web content cache size… + +####Preferences::Advanced::Network +#LOCALIZATION NOTE: The next string is for the disk usage of the application cache. +# e.g., "Your application cache is currently using 200 MB" +# %1$S = size +# %2$S = unit (MB, KB, etc.) +actualAppCacheSize=Your application cache is currently using %1$S %2$S of disk space + +####Preferences::Advanced::Network +#LOCALIZATION NOTE: The next string is for the total usage of site data. +# e.g., "The total usage is currently using 200 MB" +# %1$S = size +# %2$S = unit (MB, KB, etc.) +totalSiteDataSize=Your stored site data is currently using %1$S %2$S of disk space +clearSiteDataPromptTitle=Clear all cookies and site data +clearSiteDataPromptText=Selecting ‘Clear Now’ will clear all cookies and site data stored by Firefox. This may sign you out of websites and remove offline web content. +clearSiteDataNow=Clear Now +important=Important +default=Default +siteUsage=%1$S %2$S +# LOCALIZATION NOTE (removeAllSiteData, removeAllSiteDataShown): +# removeAllSiteData and removeAllSiteDataShown are both used on the same one button, +# never displayed together and can share the same accesskey. +# When only partial sites are shown as a result of keyword search, +# removeAllShown is displayed as button label. +# removeAll is displayed when no keyword search and all sites are shown. +removeAllSiteData.label=Remove All +removeAllSiteData.accesskey=e +removeAllSiteDataShown.label=Remove All Shown +removeAllSiteDataShown.accesskey=e +spaceAlert.learnMoreButton.label=Learn More +spaceAlert.learnMoreButton.accesskey=L +spaceAlert.over5GB.prefButton.label=Open Preferences +spaceAlert.over5GB.prefButton.accesskey=O +# LOCALIZATION NOTE (spaceAlert.over5GB.prefButtonWin.label): On Windows Preferences is called Options +spaceAlert.over5GB.prefButtonWin.label=Open Options +spaceAlert.over5GB.prefButtonWin.accesskey=O +# LOCALIZATION NOTE (spaceAlert.over5GB.message): %S = brandShortName +spaceAlert.over5GB.message=%S is running out of disk space. Website contents may not display properly. You can clear stored site data in Preferences > Advanced > Site Data. +# LOCALIZATION NOTE (spaceAlert.over5GB.messageWin): +# - On Windows Preferences is called Options +# - %S = brandShortName +spaceAlert.over5GB.messageWin=%S is running out of disk space. Website contents may not display properly. You can clear stored site data in Options > Advanced > Site Data. +spaceAlert.under5GB.okButton.label=OK, Got it +spaceAlert.under5GB.okButton.accesskey=K +# LOCALIZATION NOTE (spaceAlert.under5GB.message): %S = brandShortName +spaceAlert.under5GB.message=%S is running out of disk space. Website contents may not display properly. Visit “Learn More” to optimize your disk usage for better browsing experience. + +# LOCALIZATION NOTE (featureEnableRequiresRestart, featureDisableRequiresRestart, restartTitle): %S = brandShortName +featureEnableRequiresRestart=%S must restart to enable this feature. +featureDisableRequiresRestart=%S must restart to disable this feature. +shouldRestartTitle=Restart %S +okToRestartButton=Restart %S now +revertNoRestartButton=Revert + +restartNow=Restart Now +restartLater=Restart Later + +disableContainersAlertTitle=Close All Container Tabs? + +# LOCALIZATION NOTE (disableContainersMsg): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #S is the number of container tabs +disableContainersMsg=If you disable Container Tabs now, #S container tab will be closed. Are you sure you want to disable Container Tabs?;If you disable Container Tabs now, #S container tabs will be closed. Are you sure you want to disable Container Tabs? + +# LOCALIZATION NOTE (disableContainersOkButton): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #S is the number of container tabs +disableContainersOkButton=Close #S Container Tab;Close #S Container Tabs + +disableContainersButton2=Keep enabled + +removeContainerAlertTitle=Remove This Container? + +# LOCALIZATION NOTE (removeContainerMsg): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #S is the number of container tabs +removeContainerMsg=If you remove this Container now, #S container tab will be closed. Are you sure you want to remove this Container?;If you remove this Container now, #S container tabs will be closed. Are you sure you want to remove this Container? + +removeContainerOkButton=Remove this Container +removeContainerButton2=Don’t remove this Container diff --git a/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd b/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd new file mode 100644 index 0000000000000..4c38c111afcbc --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/search.dtd b/browser/locales/en-US/chrome/browser/preferences-old/search.dtd new file mode 100644 index 0000000000000..470933342aadc --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/search.dtd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/security.dtd b/browser/locales/en-US/chrome/browser/preferences-old/security.dtd new file mode 100644 index 0000000000000..cc067e40390d3 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/security.dtd @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd b/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd new file mode 100644 index 0000000000000..a6082862addc2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd @@ -0,0 +1,9 @@ + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd b/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd new file mode 100644 index 0000000000000..51f523a06ed50 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd b/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd new file mode 100644 index 0000000000000..277d013ed5204 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd b/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd new file mode 100644 index 0000000000000..5b3dcd621c77f --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd b/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd new file mode 100644 index 0000000000000..fc5fb2b7b6e62 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn index b1edf111714f8..02d0040e29fb9 100644 --- a/browser/locales/jar.mn +++ b/browser/locales/jar.mn @@ -50,7 +50,6 @@ locale/browser/places/places.properties (%chrome/browser/places/places.properties) locale/browser/places/editBookmarkOverlay.dtd (%chrome/browser/places/editBookmarkOverlay.dtd) locale/browser/places/bookmarkProperties.properties (%chrome/browser/places/bookmarkProperties.properties) - locale/browser/preferences/selectBookmark.dtd (%chrome/browser/preferences/selectBookmark.dtd) locale/browser/places/moveBookmarks.dtd (%chrome/browser/places/moveBookmarks.dtd) locale/browser/safebrowsing/phishing-afterload-warning-message.dtd (%chrome/browser/safebrowsing/phishing-afterload-warning-message.dtd) locale/browser/safebrowsing/report-phishing.dtd (%chrome/browser/safebrowsing/report-phishing.dtd) @@ -59,30 +58,57 @@ locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/migration/migration.dtd (%chrome/browser/migration/migration.dtd) locale/browser/migration/migration.properties (%chrome/browser/migration/migration.properties) + locale/browser/preferences-old/advanced.dtd (%chrome/browser/preferences-old/advanced.dtd) locale/browser/preferences/advanced.dtd (%chrome/browser/preferences/advanced.dtd) - locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd) - locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) + locale/browser/preferences-old/applicationManager.dtd (%chrome/browser/preferences-old/applicationManager.dtd) + locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd) + locale/browser/preferences-old/applicationManager.properties (%chrome/browser/preferences-old/applicationManager.properties) + locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) + locale/browser/preferences-old/applications.dtd (%chrome/browser/preferences-old/applications.dtd) + locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) + locale/browser/preferences-old/blocklists.dtd (%chrome/browser/preferences-old/blocklists.dtd) locale/browser/preferences/blocklists.dtd (%chrome/browser/preferences/blocklists.dtd) + locale/browser/preferences-old/colors.dtd (%chrome/browser/preferences-old/colors.dtd) locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd) - locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd) - locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) + locale/browser/preferences-old/connection.dtd (%chrome/browser/preferences-old/connection.dtd) locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd) + locale/browser/preferences-old/containers.dtd (%chrome/browser/preferences-old/containers.dtd) + locale/browser/preferences/containers.dtd (%chrome/browser/preferences/containers.dtd) + locale/browser/preferences-old/containers.properties (%chrome/browser/preferences-old/containers.properties) + locale/browser/preferences/containers.properties (%chrome/browser/preferences/containers.properties) + locale/browser/preferences-old/content.dtd (%chrome/browser/preferences-old/content.dtd) + locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) + locale/browser/preferences-old/cookies.dtd (%chrome/browser/preferences-old/cookies.dtd) + locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd) + locale/browser/preferences-old/donottrack.dtd (%chrome/browser/preferences-old/donottrack.dtd) locale/browser/preferences/donottrack.dtd (%chrome/browser/preferences/donottrack.dtd) - locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) + locale/browser/preferences-old/fonts.dtd (%chrome/browser/preferences-old/fonts.dtd) locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd) - locale/browser/preferences/main.dtd (%chrome/browser/preferences/main.dtd) + locale/browser/preferences-old/languages.dtd (%chrome/browser/preferences-old/languages.dtd) locale/browser/preferences/languages.dtd (%chrome/browser/preferences/languages.dtd) + locale/browser/preferences-old/main.dtd (%chrome/browser/preferences-old/main.dtd) + locale/browser/preferences/main.dtd (%chrome/browser/preferences/main.dtd) + locale/browser/preferences-old/permissions.dtd (%chrome/browser/preferences-old/permissions.dtd) locale/browser/preferences/permissions.dtd (%chrome/browser/preferences/permissions.dtd) + locale/browser/preferences-old/preferences.dtd (%chrome/browser/preferences-old/preferences.dtd) locale/browser/preferences/preferences.dtd (%chrome/browser/preferences/preferences.dtd) - locale/browser/preferences/preferences.properties (%chrome/browser/preferences/preferences.properties) - locale/browser/preferences/containers.properties (%chrome/browser/preferences/containers.properties) + locale/browser/preferences-old/preferences.properties (%chrome/browser/preferences-old/preferences.properties) + locale/browser/preferences/preferences.properties (%chrome/browser/preferences/preferences.properties) + locale/browser/preferences-old/privacy.dtd (%chrome/browser/preferences-old/privacy.dtd) locale/browser/preferences/privacy.dtd (%chrome/browser/preferences/privacy.dtd) + locale/browser/preferences-old/search.dtd (%chrome/browser/preferences-old/search.dtd) + locale/browser/preferences/search.dtd (%chrome/browser/preferences/search.dtd) + locale/browser/preferences-old/security.dtd (%chrome/browser/preferences-old/security.dtd) locale/browser/preferences/security.dtd (%chrome/browser/preferences/security.dtd) - locale/browser/preferences/containers.dtd (%chrome/browser/preferences/containers.dtd) + locale/browser/preferences-old/selectBookmark.dtd (%chrome/browser/preferences-old/selectBookmark.dtd) + locale/browser/preferences/selectBookmark.dtd (%chrome/browser/preferences/selectBookmark.dtd) + locale/browser/preferences-old/siteDataSettings.dtd (%chrome/browser/preferences-old/siteDataSettings.dtd) + locale/browser/preferences/siteDataSettings.dtd (%chrome/browser/preferences/siteDataSettings.dtd) + locale/browser/preferences-old/sync.dtd (%chrome/browser/preferences-old/sync.dtd) locale/browser/preferences/sync.dtd (%chrome/browser/preferences/sync.dtd) + locale/browser/preferences-old/tabs.dtd (%chrome/browser/preferences-old/tabs.dtd) locale/browser/preferences/tabs.dtd (%chrome/browser/preferences/tabs.dtd) - locale/browser/preferences/search.dtd (%chrome/browser/preferences/search.dtd) - locale/browser/preferences/siteDataSettings.dtd (%chrome/browser/preferences/siteDataSettings.dtd) + locale/browser/preferences-old/translation.dtd (%chrome/browser/preferences-old/translation.dtd) locale/browser/preferences/translation.dtd (%chrome/browser/preferences/translation.dtd) locale/browser/syncBrand.dtd (%chrome/browser/syncBrand.dtd) locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties) From 2214b3dc2ae7bd8ff0ed1c160447fd37447768ba Mon Sep 17 00:00:00 2001 From: Andrew Swan Date: Wed, 22 Mar 2017 13:46:29 -0700 Subject: [PATCH 005/300] Bug 1342142 Part 1 Toolkit test cleanups r=mossop Fixed various issues related to webextension install prompts in tests: - Some existing tests install extensions from the about:addons search page, but when about:addons is run in its own top level window, these tests fail since there is no location bar to anchor notifications to. Given the mostly unsupported nature of running about:addons in its own top level window, this patch just takes the easy way out and skips running those tests in window mode. - Fix tests that might generate prompts to acknowledge them if they are enabled. - Update the test for mozAddonManager.permissionPromptsEnabled to properly handle the case where prompts are on by default. MozReview-Commit-ID: AdPmhGfB33o --- .../test/browser/browser-common.ini | 4 ---- .../extensions/test/browser/browser.ini | 8 ++++++-- .../extensions/test/browser/browser_eula.js | 11 +++++----- .../test/browser/browser_install.js | 9 +++++---- .../test/browser/browser_searching.js | 2 ++ .../extensions/test/browser/browser_webapi.js | 6 ++++-- .../test/browser/browser_webapi_install.js | 4 ++++ .../mozapps/extensions/test/browser/head.js | 20 +++++++++++++++++++ 8 files changed, 47 insertions(+), 17 deletions(-) diff --git a/toolkit/mozapps/extensions/test/browser/browser-common.ini b/toolkit/mozapps/extensions/test/browser/browser-common.ini index 1848b0133b349..9356b00ed51ab 100644 --- a/toolkit/mozapps/extensions/test/browser/browser-common.ini +++ b/toolkit/mozapps/extensions/test/browser/browser-common.ini @@ -38,17 +38,13 @@ skip-if = buildapp == 'mulet' [browser_experiments.js] [browser_list.js] [browser_metadataTimeout.js] -[browser_searching.js] [browser_sorting.js] [browser_sorting_plugins.js] [browser_plugin_enabled_state_locked.js] [browser_uninstalling.js] -[browser_install.js] [browser_recentupdates.js] [browser_manualupdates.js] [browser_globalwarnings.js] -[browser_eula.js] -skip-if = buildapp == 'mulet' [browser_updateid.js] [browser_purchase.js] [browser_openDialog.js] diff --git a/toolkit/mozapps/extensions/test/browser/browser.ini b/toolkit/mozapps/extensions/test/browser/browser.ini index 6a4c4c88772ba..6c44706c425ab 100644 --- a/toolkit/mozapps/extensions/test/browser/browser.ini +++ b/toolkit/mozapps/extensions/test/browser/browser.ini @@ -54,18 +54,22 @@ support-files = [browser_bug616841.js] [browser_cancelCompatCheck.js] [browser_checkAddonCompatibility.js] +[browser_discovery_install.js] +[browser_eula.js] +skip-if = buildapp == 'mulet' [browser_getmorethemes.js] [browser_gmpProvider.js] [browser_hotfix.js] # Verifies the old style of signing hotfixes skip-if = require_signing +[browser_install.js] [browser_installssl.js] [browser_newaddon.js] -[browser_updatessl.js] +[browser_searching.js] [browser_system_addons_are_e10s.js] [browser_task_next_test.js] -[browser_discovery_install.js] [browser_update.js] +[browser_updatessl.js] [browser_webapi.js] [browser_webapi_access.js] [browser_webapi_addon_listener.js] diff --git a/toolkit/mozapps/extensions/test/browser/browser_eula.js b/toolkit/mozapps/extensions/test/browser/browser_eula.js index 1842d9cbf96ed..efb47965102c5 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_eula.js +++ b/toolkit/mozapps/extensions/test/browser/browser_eula.js @@ -16,7 +16,7 @@ function test() { Services.prefs.setIntPref(PREF_SEARCH_MAXRESULTS, 15); Services.prefs.setCharPref("extensions.getAddons.search.url", TESTROOT + "browser_eula.xml"); - open_manager(null, function(aWindow) { + open_manager("addons://list/extension", function(aWindow) { gManagerWindow = aWindow; run_next_test(); }); @@ -49,11 +49,12 @@ function installSearchResult(aCallback) { let status = get_node(item, "install-status"); EventUtils.synthesizeMouseAtCenter(get_node(status, "install-remote-btn"), {}, gManagerWindow); - item.mInstall.addListener({ - onInstallEnded() { - executeSoon(aCallback); - } + let promptPromise = promiseNotification(); + let installPromise = new Promise(resolve => { + item.mInstall.addListener({onInstallEnded: resolve}); }); + + promptPromise.then(() => installPromise).then(aCallback); }); } diff --git a/toolkit/mozapps/extensions/test/browser/browser_install.js b/toolkit/mozapps/extensions/test/browser/browser_install.js index 1599cd9e8783f..75263629a233d 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_install.js +++ b/toolkit/mozapps/extensions/test/browser/browser_install.js @@ -109,11 +109,12 @@ function installSearchResult(aCallback) { let status = get_node(item, "install-status"); EventUtils.synthesizeMouseAtCenter(get_node(status, "install-remote-btn"), {}, gManagerWindow); - item.mInstall.addListener({ - onInstallEnded() { - executeSoon(aCallback); - } + let promptPromise = promiseNotification(); + let installPromise = new Promise(resolve => { + item.mInstall.addListener({onInstallEnded: resolve}); }); + + promptPromise.then(() => installPromise).then(aCallback); }); } diff --git a/toolkit/mozapps/extensions/test/browser/browser_searching.js b/toolkit/mozapps/extensions/test/browser/browser_searching.js index 4521144a00267..ad2015483f2aa 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_searching.js +++ b/toolkit/mozapps/extensions/test/browser/browser_searching.js @@ -552,6 +552,8 @@ add_test(function() { installBtn = get_install_button(remoteItem); is(installBtn.hidden, false, "Install button should be showing before install"); remoteItem.mAddon.install.addListener(listener); + // If prompts are enabled, accept the install prompt. + promiseNotification(); EventUtils.synthesizeMouseAtCenter(installBtn, { }, gManagerWindow); }); }); diff --git a/toolkit/mozapps/extensions/test/browser/browser_webapi.js b/toolkit/mozapps/extensions/test/browser/browser_webapi.js index 823f1c907703c..622a87d65a2b6 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_webapi.js +++ b/toolkit/mozapps/extensions/test/browser/browser_webapi.js @@ -114,8 +114,10 @@ add_task(testWithAPI(function*(browser) { } const PERM = "extensions.webextPermissionPrompts"; - yield SpecialPowers.pushPrefEnv({clear: [[PERM]]}); - yield check(false, `mozAddonManager.permissionPromptsEnabled is false when ${PERM} is unset`); + if (Services.prefs.getBoolPref(PERM, false) == false) { + yield SpecialPowers.pushPrefEnv({clear: [[PERM]]}); + yield check(false, `mozAddonManager.permissionPromptsEnabled is false when ${PERM} is unset`); + } yield SpecialPowers.pushPrefEnv({set: [[PERM, true]]}); yield check(true, `mozAddonManager.permissionPromptsEnabled is true when ${PERM} is set`); diff --git a/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js b/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js index 0788cc0453a69..fd28a2ce77a68 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js +++ b/toolkit/mozapps/extensions/test/browser/browser_webapi_install.js @@ -197,8 +197,12 @@ function makeRegularTest(options, what) { }, ]; + let promptPromise = promiseNotification("addon-installed"); + yield testInstall(browser, options, steps, what); + yield promptPromise; + let version = Services.prefs.getIntPref("webapitest.active_version"); is(version, 1, "the install really did work"); diff --git a/toolkit/mozapps/extensions/test/browser/head.js b/toolkit/mozapps/extensions/test/browser/head.js index 2ab1fd356abe5..0dc7ade20b00d 100644 --- a/toolkit/mozapps/extensions/test/browser/head.js +++ b/toolkit/mozapps/extensions/test/browser/head.js @@ -1453,3 +1453,23 @@ function getTestPluginTag() { ok(false, "Unable to find plugin"); return null; } + +// Wait for and then acknowledge (by pressing the primary button) the +// given notification. +function promiseNotification(id = "addon-webext-permissions") { + if (!Services.prefs.getBoolPref("extensions.webextPermissionPrompts", false)) { + return Promise.resolve(); + } + + return new Promise(resolve => { + function popupshown() { + let notification = PopupNotifications.getNotification(id); + if (notification) { + PopupNotifications.panel.removeEventListener("popupshown", popupshown); + PopupNotifications.panel.firstChild.button.click(); + resolve(); + } + } + PopupNotifications.panel.addEventListener("popupshown", popupshown); + }); +} From 90ceec5764dffebc09d2dbee9653649719c207c7 Mon Sep 17 00:00:00 2001 From: Andrew Swan Date: Fri, 10 Mar 2017 16:05:26 -0800 Subject: [PATCH 006/300] Bug 1342142 Part 2 Enable webextension permission prompts r=mossop MozReview-Commit-ID: 5p4lvWXn9Hh --- browser/app/profile/firefox.js | 1 + .../content/test/general/browser_bug553455.js | 17 ++++++----------- .../browser_extension_sideloading.js | 5 ----- .../browser_extension_update_background.js | 3 --- .../browser_permissions_unsigned.js | 3 --- .../webextensions/browser_update_interactive.js | 3 --- .../browser_update_interactive_noprompt.js | 3 --- browser/base/content/test/webextensions/head.js | 3 --- 8 files changed, 7 insertions(+), 31 deletions(-) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index c96cb448b2e13..38d7b85fcdcf1 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -38,6 +38,7 @@ pref("extensions.minCompatibleAppVersion", "4.0"); pref("extensions.checkCompatibility.temporaryThemeOverride_minAppVersion", "29.0a1"); pref("xpinstall.customConfirmationUI", true); +pref("extensions.webextPermissionPrompts", true); // Preferences for AMO integration pref("extensions.getAddons.cache.enabled", true); diff --git a/browser/base/content/test/general/browser_bug553455.js b/browser/base/content/test/general/browser_bug553455.js index 96a2f12db6030..feb45d8a830a1 100644 --- a/browser/base/content/test/general/browser_bug553455.js +++ b/browser/base/content/test/general/browser_bug553455.js @@ -34,6 +34,8 @@ function getObserverTopic(aNotificationId) { topic = "addon-install-started"; else if (topic == "addon-install-restart") topic = "addon-install-complete"; + else if (topic == "addon-installed") + topic = "webextension-install-notify"; return topic; } @@ -441,14 +443,9 @@ function test_restartless() { yield progressPromise; let installDialog = yield dialogPromise; - let notificationPromise = waitForNotification("addon-install-complete"); + let notificationPromise = waitForNotification("addon-installed"); acceptInstallDialog(installDialog); - let panel = yield notificationPromise; - - let notification = panel.childNodes[0]; - is(notification.getAttribute("label"), - "XPI Test has been installed successfully.", - "Should have seen the right message"); + yield notificationPromise; let installs = yield getInstalls(); is(installs.length, 0, "Should be no pending installs"); @@ -574,7 +571,7 @@ function test_allUnverified() { is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on"); is(container.childNodes[0].childNodes.length, 1, "Shouldn't have the unverified marker"); - let notificationPromise = waitForNotification("addon-install-complete"); + let notificationPromise = waitForNotification("addon-installed"); acceptInstallDialog(installDialog); yield notificationPromise; @@ -1024,7 +1021,7 @@ var gTestStart = null; var XPInstallObserver = { observe(aSubject, aTopic, aData) { - var installInfo = aSubject.QueryInterface(Components.interfaces.amIWebInstallInfo); + var installInfo = aSubject.wrappedJSObject; info("Observed " + aTopic + " for " + installInfo.installs.length + " installs"); installInfo.installs.forEach(function(aInstall) { info("Install of " + aInstall.sourceURI.spec + " was in state " + aInstall.state); @@ -1043,7 +1040,6 @@ add_task(function* () { Services.obs.addObserver(XPInstallObserver, "addon-install-started", false); Services.obs.addObserver(XPInstallObserver, "addon-install-blocked", false); Services.obs.addObserver(XPInstallObserver, "addon-install-failed", false); - Services.obs.addObserver(XPInstallObserver, "addon-install-complete", false); registerCleanupFunction(function() { // Make sure no more test parts run in case we were timed out @@ -1063,7 +1059,6 @@ add_task(function* () { Services.obs.removeObserver(XPInstallObserver, "addon-install-started"); Services.obs.removeObserver(XPInstallObserver, "addon-install-blocked"); Services.obs.removeObserver(XPInstallObserver, "addon-install-failed"); - Services.obs.removeObserver(XPInstallObserver, "addon-install-complete"); }); for (let i = 0; i < TESTS.length; ++i) { diff --git a/browser/base/content/test/webextensions/browser_extension_sideloading.js b/browser/base/content/test/webextensions/browser_extension_sideloading.js index fac2bdb9abb6d..8e8f917d20c14 100644 --- a/browser/base/content/test/webextensions/browser_extension_sideloading.js +++ b/browser/base/content/test/webextensions/browser_extension_sideloading.js @@ -81,11 +81,6 @@ function promiseSetDisabled(addon) { let cleanup; add_task(function* () { - // XXX remove this when prompts are enabled by default - yield SpecialPowers.pushPrefEnv({set: [ - ["extensions.webextPermissionPrompts", true], - ]}); - // ICON_URL wouldn't ever appear as an actual webextension icon, but // we're just mocking out the addon here, so all we care about is that // that it propagates correctly to the popup. diff --git a/browser/base/content/test/webextensions/browser_extension_update_background.js b/browser/base/content/test/webextensions/browser_extension_update_background.js index c15202fe9fa1f..d57d9efa38cc4 100644 --- a/browser/base/content/test/webextensions/browser_extension_update_background.js +++ b/browser/base/content/test/webextensions/browser_extension_update_background.js @@ -35,9 +35,6 @@ add_task(function* setup() { // We don't have pre-pinned certificates for the local mochitest server ["extensions.install.requireBuiltInCerts", false], ["extensions.update.requireBuiltInCerts", false], - - // XXX remove this when prompts are enabled by default - ["extensions.webextPermissionPrompts", true], ]}); // Navigate away from the initial page so that about:addons always diff --git a/browser/base/content/test/webextensions/browser_permissions_unsigned.js b/browser/base/content/test/webextensions/browser_permissions_unsigned.js index 15735263f1b99..6b6120fb640d5 100644 --- a/browser/base/content/test/webextensions/browser_permissions_unsigned.js +++ b/browser/base/content/test/webextensions/browser_permissions_unsigned.js @@ -7,9 +7,6 @@ add_task(async function test_unsigned() { await SpecialPowers.pushPrefEnv({set: [ ["extensions.webapi.testing", true], ["extensions.install.requireBuiltInCerts", false], - - // XXX remove this when prompts are enabled by default - ["extensions.webextPermissionPrompts", true], ]}); let testURI = makeURI("https://example.com/"); diff --git a/browser/base/content/test/webextensions/browser_update_interactive.js b/browser/base/content/test/webextensions/browser_update_interactive.js index 965043e475586..e259921e1923e 100644 --- a/browser/base/content/test/webextensions/browser_update_interactive.js +++ b/browser/base/content/test/webextensions/browser_update_interactive.js @@ -8,9 +8,6 @@ add_task(function* setup() { // We don't have pre-pinned certificates for the local mochitest server ["extensions.install.requireBuiltInCerts", false], ["extensions.update.requireBuiltInCerts", false], - - // XXX remove this when prompts are enabled by default - ["extensions.webextPermissionPrompts", true], ]}); }); diff --git a/browser/base/content/test/webextensions/browser_update_interactive_noprompt.js b/browser/base/content/test/webextensions/browser_update_interactive_noprompt.js index 639d2fb1cf9c5..56e7974b203a6 100644 --- a/browser/base/content/test/webextensions/browser_update_interactive_noprompt.js +++ b/browser/base/content/test/webextensions/browser_update_interactive_noprompt.js @@ -8,9 +8,6 @@ add_task(function* setup() { // Point updates to the local mochitest server ["extensions.update.url", `${BASE}/browser_webext_update.json`], - - // XXX remove this when prompts are enabled by default - ["extensions.webextPermissionPrompts", true], ]}); }); diff --git a/browser/base/content/test/webextensions/head.js b/browser/base/content/test/webextensions/head.js index 12a84d57ca8f3..c6a7ac319e74a 100644 --- a/browser/base/content/test/webextensions/head.js +++ b/browser/base/content/test/webextensions/head.js @@ -217,9 +217,6 @@ async function testInstallMethod(installFn, telemetryBase) { await SpecialPowers.pushPrefEnv({set: [ ["extensions.webapi.testing", true], ["extensions.install.requireBuiltInCerts", false], - - // XXX remove this when prompts are enabled by default - ["extensions.webextPermissionPrompts", true], ]}); if (telemetryBase !== undefined) { From 757063a5bd6ef89790f15245022f16abceae62bf Mon Sep 17 00:00:00 2001 From: Christian Holler Date: Wed, 22 Mar 2017 21:48:51 +0100 Subject: [PATCH 007/300] Bug 1349611 - Fix broken Clang hash in releng.manifest. r=froydnj MozReview-Commit-ID: 2Sc480veJqU --- browser/config/tooltool-manifests/linux64/releng.manifest | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/config/tooltool-manifests/linux64/releng.manifest b/browser/config/tooltool-manifests/linux64/releng.manifest index 530cc8f78686e..258e1a4b2aae1 100644 --- a/browser/config/tooltool-manifests/linux64/releng.manifest +++ b/browser/config/tooltool-manifests/linux64/releng.manifest @@ -34,8 +34,8 @@ }, { "version": "clang + llvm 3.9.0, built from SVN r290136", - "size": 151724092, - "digest": "4ab5ff2131e4ce4888d38c17feb192c19bc6ede83abef55af7d2f29e2446f6335dc860377fa25cbb0283b3958c0a3d377a3cfdc7705a85d4843e3ab357ddca7f", + "size": 168062128, + "digest": "2a5458a25792fcade86a56ff0f4acdfa284d2b62966991a7c34a92c2e8c0b4a162ce00512d4467754e7f74598d64c56e91517e1606ed3fba011f7c10e8ad3288", "algorithm": "sha512", "filename": "clang.tar.xz", "unpack": true From 38932ecd352b69c0f2e5d0ba8308ffcefbf18e20 Mon Sep 17 00:00:00 2001 From: Edouard Oger Date: Tue, 14 Mar 2017 14:42:24 -0400 Subject: [PATCH 008/300] Bug 692700 part 1 - Set X-If-Unmodified-Since when uploading meta/global. r=markh MozReview-Commit-ID: IoiThiDlvCj --- services/sync/modules/service.js | 53 +++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/services/sync/modules/service.js b/services/sync/modules/service.js index d1e5d9f83740a..c308ff0cc749c 100644 --- a/services/sync/modules/service.js +++ b/services/sync/modules/service.js @@ -902,16 +902,9 @@ Sync11Service.prototype = { if (this.recordManager.response.status == 404) { this._log.debug("No meta/global record on the server. Creating one."); - newMeta = new WBORecord("meta", "global"); - newMeta.payload.syncID = this.syncID; - newMeta.payload.storageVersion = STORAGE_VERSION; - newMeta.payload.declined = this.engineManager.getDeclined(); - - newMeta.isNew = true; - - this.recordManager.set(this.metaURL, newMeta); - let uploadRes = newMeta.upload(this.resource(this.metaURL)); - if (!uploadRes.success) { + try { + this._uploadNewMetaGlobal(); + } catch (uploadRes) { this._log.warn("Unable to upload new meta/global. Failing remote setup."); this.errorHandler.checkServerError(uploadRes); return false; @@ -1116,20 +1109,36 @@ Sync11Service.prototype = { }, /** - * Upload meta/global, throwing the response on failure. + * Upload a fresh meta/global record + * @throws the response object if the upload request was not a success */ - uploadMetaGlobal(meta) { - this._log.debug("Uploading meta/global: " + JSON.stringify(meta)); + _uploadNewMetaGlobal() { + let meta = new WBORecord("meta", "global"); + meta.payload.syncID = this.syncID; + meta.payload.storageVersion = STORAGE_VERSION; + meta.payload.declined = this.engineManager.getDeclined(); + meta.modified = 0; + meta.isNew = true; + + this.uploadMetaGlobal(meta); + }, - // It would be good to set the X-If-Unmodified-Since header to `timestamp` - // for this PUT to ensure at least some level of transactionality. - // Unfortunately, the servers don't support it after a wipe right now - // (bug 693893), so we're going to defer this until bug 692700. + /** + * Upload meta/global, throwing the response on failure + * @param {WBORecord} meta meta/global record + * @throws the response object if the request was not a success + */ + uploadMetaGlobal(meta) { + this._log.debug("Uploading meta/global", meta); let res = this.resource(this.metaURL); + res.setHeader("X-If-Unmodified-Since", meta.modified); let response = res.put(meta); if (!response.success) { throw response; } + // From https://docs.services.mozilla.com/storage/apis-1.5.html: + // "Successful responses will return the new last-modified time for the collection." + meta.modified = response.obj; this.recordManager.set(this.metaURL, meta); }, @@ -1142,17 +1151,11 @@ Sync11Service.prototype = { this.wipeServer(); // Upload a new meta/global record. - let meta = new WBORecord("meta", "global"); - meta.payload.syncID = this.syncID; - meta.payload.storageVersion = STORAGE_VERSION; - meta.payload.declined = this.engineManager.getDeclined(); - meta.isNew = true; - - // uploadMetaGlobal throws on failure -- including race conditions. + // _uploadNewMetaGlobal throws on failure -- including race conditions. // If we got into a race condition, we'll abort the sync this way, too. // That's fine. We'll just wait till the next sync. The client that we're // racing is probably busy uploading stuff right now anyway. - this.uploadMetaGlobal(meta); + this._uploadNewMetaGlobal(); // Wipe everything we know about except meta because we just uploaded it // TODO: there's a bug here. We should be calling resetClient, no? From add99b68bfcf29e20a007e7e748062000e7ab85e Mon Sep 17 00:00:00 2001 From: Edouard Oger Date: Tue, 14 Mar 2017 15:56:08 -0400 Subject: [PATCH 009/300] Bug 692700 part 2 - Set X-If-Unmodified-Since when uploading crypto/keys. r=markh MozReview-Commit-ID: 9qrr8vuvy1I --- services/sync/modules/service.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/services/sync/modules/service.js b/services/sync/modules/service.js index c308ff0cc749c..8a8e4c377bc6f 100644 --- a/services/sync/modules/service.js +++ b/services/sync/modules/service.js @@ -230,12 +230,13 @@ Sync11Service.prototype = { cryptoKeys.ciphertext = cipherText; cryptoKeys.cleartext = null; - let uploadResp = cryptoKeys.upload(this.resource(this.cryptoKeysURL)); - if (uploadResp.success) + let uploadResp = this._uploadCryptoKeys(cryptoKeys, cryptoResp.obj.modified); + if (uploadResp.success) { this._log.info("Successfully re-uploaded keys. Continuing sync."); - else + } else { this._log.warn("Got error response re-uploading keys. " + "Continuing sync; let's try again later."); + } return false; // Don't try again: same keys. @@ -676,8 +677,7 @@ Sync11Service.prototype = { this._log.info("Encrypting new key bundle."); wbo.encrypt(this.identity.syncKeyBundle); - this._log.info("Uploading..."); - let uploadRes = wbo.upload(this.resource(this.cryptoKeysURL)); + let uploadRes = this._uploadCryptoKeys(wbo, 0); if (uploadRes.status != 200) { this._log.warn("Got status " + uploadRes.status + " uploading new keys. What to do? Throw!"); this.errorHandler.checkServerError(uploadRes); @@ -1142,6 +1142,19 @@ Sync11Service.prototype = { this.recordManager.set(this.metaURL, meta); }, + /** + * Upload crypto/keys + * @param {WBORecord} cryptoKeys crypto/keys record + * @param {Number} lastModified known last modified timestamp (in decimal seconds), + * will be used to set the X-If-Unmodified-Since header + */ + _uploadCryptoKeys(cryptoKeys, lastModified) { + this._log.debug(`Uploading crypto/keys (lastModified: ${lastModified})`); + let res = this.resource(this.cryptoKeysURL); + res.setHeader("X-If-Unmodified-Since", lastModified); + return res.put(cryptoKeys); + }, + _freshStart: function _freshStart() { this._log.info("Fresh start. Resetting client."); this.resetClient(); From b24556e0f2adaa0e8f827f1a0c25a1d02878f6e4 Mon Sep 17 00:00:00 2001 From: Wes Kocher Date: Wed, 22 Mar 2017 14:29:18 -0700 Subject: [PATCH 010/300] Backed out changeset f23ce5b464f8 (bug 1343682) for build bustage a=backout MozReview-Commit-ID: FiNslDCHP1S --- browser/components/about/AboutRedirector.cpp | 12 - browser/components/about/AboutRedirector.h | 3 - .../preferences/in-content-old/advanced.js | 798 ------- .../preferences/in-content-old/advanced.xul | 436 ---- .../in-content-old/applications.js | 1897 ----------------- .../in-content-old/applications.xul | 95 - .../preferences/in-content-old/containers.js | 99 - .../preferences/in-content-old/containers.xul | 54 - .../preferences/in-content-old/content.js | 283 --- .../preferences/in-content-old/content.xul | 207 -- .../preferences/in-content-old/jar.mn | 18 - .../preferences/in-content-old/main.js | 699 ------ .../preferences/in-content-old/main.xul | 301 --- .../preferences/in-content-old/moz.build | 13 - .../preferences/in-content-old/preferences.js | 313 --- .../in-content-old/preferences.xul | 224 -- .../preferences/in-content-old/privacy.js | 698 ------ .../preferences/in-content-old/privacy.xul | 311 --- .../preferences/in-content-old/search.js | 604 ------ .../preferences/in-content-old/search.xul | 86 - .../preferences/in-content-old/security.js | 292 --- .../preferences/in-content-old/security.xul | 131 -- .../preferences/in-content-old/subdialogs.js | 438 ---- .../preferences/in-content-old/sync.js | 492 ----- .../preferences/in-content-old/sync.xul | 225 -- .../in-content-old/tests/.eslintrc.js | 7 - .../in-content-old/tests/browser.ini | 47 - .../tests/browser_advanced_siteData.js | 649 ------ .../tests/browser_advanced_update.js | 155 -- .../tests/browser_applications_selection.js | 79 - .../tests/browser_basic_rebuild_fonts_test.js | 76 - .../browser_bug1018066_resetScrollPosition.js | 24 - ...g1020245_openPreferences_to_paneContent.js | 41 - ...vent_scrolling_when_preferences_flipped.js | 95 - ...ent_scrolling_when_preferences_flipped.xul | 33 - .../in-content-old/tests/browser_bug410900.js | 46 - .../in-content-old/tests/browser_bug705422.js | 144 -- .../in-content-old/tests/browser_bug731866.js | 52 - .../tests/browser_bug795764_cachedisabled.js | 52 - .../tests/browser_change_app_handler.js | 98 - .../tests/browser_connection.js | 99 - .../tests/browser_connection_bug388287.js | 125 -- .../tests/browser_cookies_exceptions.js | 351 --- .../browser_defaultbrowser_alwayscheck.js | 103 - .../tests/browser_healthreport.js | 62 - ...owser_homepages_filter_aboutpreferences.js | 20 - .../browser_notifications_do_not_disturb.js | 44 - .../browser_permissions_urlFieldHidden.js | 45 - .../tests/browser_privacypane_1.js | 19 - .../tests/browser_privacypane_3.js | 18 - .../tests/browser_privacypane_4.js | 26 - .../tests/browser_privacypane_5.js | 18 - .../tests/browser_privacypane_8.js | 27 - .../tests/browser_proxy_backup.js | 65 - .../browser_sanitizeOnShutdown_prefLocked.js | 39 - .../tests/browser_searchsuggestions.js | 43 - .../in-content-old/tests/browser_security.js | 130 -- .../tests/browser_subdialogs.js | 292 --- .../in-content-old/tests/browser_telemetry.js | 52 - .../preferences/in-content-old/tests/head.js | 192 -- .../tests/privacypane_tests_perwindow.js | 333 --- .../in-content-old/tests/site_data_test.html | 29 - .../in-content-old/tests/subdialog.xul | 27 - .../in-content-old/tests/subdialog2.xul | 27 - browser/components/preferences/moz.build | 8 +- browser/installer/allowed-dupes.mn | 11 - .../browser/preferences-old/advanced.dtd | 127 -- .../preferences-old/applicationManager.dtd | 8 - .../applicationManager.properties | 14 - .../browser/preferences-old/applications.dtd | 14 - .../browser/preferences-old/blocklists.dtd | 14 - .../chrome/browser/preferences-old/colors.dtd | 30 - .../browser/preferences-old/connection.dtd | 49 - .../browser/preferences-old/containers.dtd | 26 - .../preferences-old/containers.properties | 24 - .../browser/preferences-old/content.dtd | 60 - .../browser/preferences-old/cookies.dtd | 28 - .../browser/preferences-old/donottrack.dtd | 13 - .../chrome/browser/preferences-old/fonts.dtd | 107 - .../browser/preferences-old/languages.dtd | 18 - .../chrome/browser/preferences-old/main.dtd | 45 - .../browser/preferences-old/permissions.dtd | 28 - .../browser/preferences-old/preferences.dtd | 29 - .../preferences-old/preferences.properties | 253 --- .../browser/preferences-old/privacy.dtd | 113 - .../chrome/browser/preferences-old/search.dtd | 29 - .../browser/preferences-old/security.dtd | 40 - .../preferences-old/selectBookmark.dtd | 9 - .../preferences-old/siteDataSettings.dtd | 20 - .../chrome/browser/preferences-old/sync.dtd | 86 - .../chrome/browser/preferences-old/tabs.dtd | 22 - .../browser/preferences-old/translation.dtd | 24 - browser/locales/jar.mn | 50 +- 93 files changed, 14 insertions(+), 13798 deletions(-) delete mode 100644 browser/components/preferences/in-content-old/advanced.js delete mode 100644 browser/components/preferences/in-content-old/advanced.xul delete mode 100644 browser/components/preferences/in-content-old/applications.js delete mode 100644 browser/components/preferences/in-content-old/applications.xul delete mode 100644 browser/components/preferences/in-content-old/containers.js delete mode 100644 browser/components/preferences/in-content-old/containers.xul delete mode 100644 browser/components/preferences/in-content-old/content.js delete mode 100644 browser/components/preferences/in-content-old/content.xul delete mode 100644 browser/components/preferences/in-content-old/jar.mn delete mode 100644 browser/components/preferences/in-content-old/main.js delete mode 100644 browser/components/preferences/in-content-old/main.xul delete mode 100644 browser/components/preferences/in-content-old/moz.build delete mode 100644 browser/components/preferences/in-content-old/preferences.js delete mode 100644 browser/components/preferences/in-content-old/preferences.xul delete mode 100644 browser/components/preferences/in-content-old/privacy.js delete mode 100644 browser/components/preferences/in-content-old/privacy.xul delete mode 100644 browser/components/preferences/in-content-old/search.js delete mode 100644 browser/components/preferences/in-content-old/search.xul delete mode 100644 browser/components/preferences/in-content-old/security.js delete mode 100644 browser/components/preferences/in-content-old/security.xul delete mode 100644 browser/components/preferences/in-content-old/subdialogs.js delete mode 100644 browser/components/preferences/in-content-old/sync.js delete mode 100755 browser/components/preferences/in-content-old/sync.xul delete mode 100644 browser/components/preferences/in-content-old/tests/.eslintrc.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser.ini delete mode 100644 browser/components/preferences/in-content-old/tests/browser_advanced_siteData.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_advanced_update.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_applications_selection.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_basic_rebuild_fonts_test.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1018066_resetScrollPosition.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1020245_openPreferences_to_paneContent.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.xul delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug410900.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug705422.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug731866.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_bug795764_cachedisabled.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_change_app_handler.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_connection.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_connection_bug388287.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_cookies_exceptions.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_defaultbrowser_alwayscheck.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_healthreport.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_homepages_filter_aboutpreferences.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_notifications_do_not_disturb.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_permissions_urlFieldHidden.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_1.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_3.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_4.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_5.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_8.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_proxy_backup.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_sanitizeOnShutdown_prefLocked.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_searchsuggestions.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_security.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_subdialogs.js delete mode 100644 browser/components/preferences/in-content-old/tests/browser_telemetry.js delete mode 100644 browser/components/preferences/in-content-old/tests/head.js delete mode 100644 browser/components/preferences/in-content-old/tests/privacypane_tests_perwindow.js delete mode 100755 browser/components/preferences/in-content-old/tests/site_data_test.html delete mode 100644 browser/components/preferences/in-content-old/tests/subdialog.xul delete mode 100644 browser/components/preferences/in-content-old/tests/subdialog2.xul delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applications.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/colors.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/connection.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/containers.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/containers.properties delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/content.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/languages.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/main.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/preferences.properties delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/search.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/security.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/sync.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd delete mode 100644 browser/locales/en-US/chrome/browser/preferences-old/translation.dtd diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp index b9de6a3187226..0d1c6ea5af239 100644 --- a/browser/components/about/AboutRedirector.cpp +++ b/browser/components/about/AboutRedirector.cpp @@ -13,7 +13,6 @@ #include "nsIScriptSecurityManager.h" #include "nsIProtocolHandler.h" #include "mozilla/ArrayUtils.h" -#include "mozilla/Preferences.h" #include "nsServiceManagerUtils.h" namespace mozilla { @@ -21,8 +20,6 @@ namespace browser { NS_IMPL_ISUPPORTS(AboutRedirector, nsIAboutModule) -bool AboutRedirector::sUseOldPreferences = false; - struct RedirEntry { const char* id; const char* url; @@ -141,13 +138,6 @@ AboutRedirector::NewChannel(nsIURI* aURI, nsCOMPtr ioService = do_GetIOService(&rv); NS_ENSURE_SUCCESS(rv, rv); - static bool sPrefCacheInited = false; - if (!sPrefCacheInited) { - Preferences::AddBoolVarCache(&sUseOldPreferences, - "browser.preferences.useOldOrganization"); - sPrefCacheInited = true; - } - for (auto & redir : kRedirMap) { if (!strcmp(path.get(), redir.id)) { nsAutoCString url; @@ -159,8 +149,6 @@ AboutRedirector::NewChannel(nsIURI* aURI, NS_ENSURE_SUCCESS(rv, rv); rv = aboutNewTabService->GetDefaultURL(url); NS_ENSURE_SUCCESS(rv, rv); - } else if (path.EqualsLiteral("preferences") && sUseOldPreferences) { - url.AssignASCII("chrome://browser/content/preferences/in-content-old/preferences.xul"); } // fall back to the specified url in the map if (url.IsEmpty()) { diff --git a/browser/components/about/AboutRedirector.h b/browser/components/about/AboutRedirector.h index eaf25e3400a99..8feeb74912e56 100644 --- a/browser/components/about/AboutRedirector.h +++ b/browser/components/about/AboutRedirector.h @@ -24,9 +24,6 @@ class AboutRedirector : public nsIAboutModule protected: virtual ~AboutRedirector() {} - -private: - static bool sUseOldPreferences; }; } // namespace browser diff --git a/browser/components/preferences/in-content-old/advanced.js b/browser/components/preferences/in-content-old/advanced.js deleted file mode 100644 index bfd4505c6d6a8..0000000000000 --- a/browser/components/preferences/in-content-old/advanced.js +++ /dev/null @@ -1,798 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -/* import-globals-from preferences.js */ - -// Load DownloadUtils module for convertByteUnits -Components.utils.import("resource://gre/modules/DownloadUtils.jsm"); -Components.utils.import("resource://gre/modules/LoadContextInfo.jsm"); -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); - -XPCOMUtils.defineLazyModuleGetter(this, "SiteDataManager", - "resource:///modules/SiteDataManager.jsm"); - -const PREF_UPLOAD_ENABLED = "datareporting.healthreport.uploadEnabled"; - -var gAdvancedPane = { - _inited: false, - - /** - * Brings the appropriate tab to the front and initializes various bits of UI. - */ - init() { - function setEventListener(aId, aEventType, aCallback) { - document.getElementById(aId) - .addEventListener(aEventType, aCallback.bind(gAdvancedPane)); - } - - this._inited = true; - var advancedPrefs = document.getElementById("advancedPrefs"); - - var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex"); - if (preference.value !== null) - advancedPrefs.selectedIndex = preference.value; - - if (AppConstants.MOZ_UPDATER) { - let onUnload = function() { - window.removeEventListener("unload", onUnload); - Services.prefs.removeObserver("app.update.", this); - }.bind(this); - window.addEventListener("unload", onUnload); - Services.prefs.addObserver("app.update.", this, false); - this.updateReadPrefs(); - } - this.updateOfflineApps(); - if (AppConstants.MOZ_CRASHREPORTER) { - this.initSubmitCrashes(); - } - this.initTelemetry(); - if (AppConstants.MOZ_TELEMETRY_REPORTING) { - this.initSubmitHealthReport(); - } - this.updateOnScreenKeyboardVisibility(); - this.updateCacheSizeInputField(); - this.updateActualCacheSize(); - this.updateActualAppCacheSize(); - - if (Services.prefs.getBoolPref("browser.storageManager.enabled")) { - Services.obs.addObserver(this, "sitedatamanager:sites-updated", false); - let unload = () => { - window.removeEventListener("unload", unload); - Services.obs.removeObserver(this, "sitedatamanager:sites-updated"); - }; - window.addEventListener("unload", unload); - SiteDataManager.updateSites(); - setEventListener("clearSiteDataButton", "command", - gAdvancedPane.clearSiteData); - setEventListener("siteDataSettings", "command", - gAdvancedPane.showSiteDataSettings); - - let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "storage-permissions"; - document.getElementById("siteDataLearnMoreLink").setAttribute("href", url); - } - - setEventListener("layers.acceleration.disabled", "change", - gAdvancedPane.updateHardwareAcceleration); - setEventListener("advancedPrefs", "select", - gAdvancedPane.tabSelectionChanged); - if (AppConstants.MOZ_TELEMETRY_REPORTING) { - setEventListener("submitHealthReportBox", "command", - gAdvancedPane.updateSubmitHealthReport); - } - - setEventListener("connectionSettings", "command", - gAdvancedPane.showConnections); - setEventListener("clearCacheButton", "command", - gAdvancedPane.clearCache); - setEventListener("clearOfflineAppCacheButton", "command", - gAdvancedPane.clearOfflineAppCache); - setEventListener("offlineNotifyExceptions", "command", - gAdvancedPane.showOfflineExceptions); - setEventListener("offlineAppsList", "select", - gAdvancedPane.offlineAppSelected); - let bundlePrefs = document.getElementById("bundlePreferences"); - document.getElementById("offlineAppsList") - .style.height = bundlePrefs.getString("offlineAppsList.height"); - setEventListener("offlineAppsListRemove", "command", - gAdvancedPane.removeOfflineApp); - if (AppConstants.MOZ_UPDATER) { - setEventListener("updateRadioGroup", "command", - gAdvancedPane.updateWritePrefs); - setEventListener("showUpdateHistory", "command", - gAdvancedPane.showUpdates); - } - setEventListener("viewCertificatesButton", "command", - gAdvancedPane.showCertificates); - setEventListener("viewSecurityDevicesButton", "command", - gAdvancedPane.showSecurityDevices); - setEventListener("cacheSize", "change", - gAdvancedPane.updateCacheSizePref); - - if (AppConstants.MOZ_WIDGET_GTK) { - // GTK tabbox' allow the scroll wheel to change the selected tab, - // but we don't want this behavior for the in-content preferences. - let tabsElement = document.getElementById("tabsElement"); - tabsElement.addEventListener("DOMMouseScroll", event => { - event.stopPropagation(); - }, true); - } - }, - - /** - * Stores the identity of the current tab in preferences so that the selected - * tab can be persisted between openings of the preferences window. - */ - tabSelectionChanged() { - if (!this._inited) - return; - var advancedPrefs = document.getElementById("advancedPrefs"); - var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex"); - - // tabSelectionChanged gets called twice due to the selectedIndex being set - // by both the selectedItem and selectedPanel callstacks. This guard is used - // to prevent double-counting in Telemetry. - if (preference.valueFromPreferences != advancedPrefs.selectedIndex) { - Services.telemetry - .getHistogramById("FX_PREFERENCES_CATEGORY_OPENED") - .add(telemetryBucketForCategory("advanced")); - } - - preference.valueFromPreferences = advancedPrefs.selectedIndex; - }, - - // GENERAL TAB - - /* - * Preferences: - * - * accessibility.browsewithcaret - * - true enables keyboard navigation and selection within web pages using a - * visible caret, false uses normal keyboard navigation with no caret - * accessibility.typeaheadfind - * - when set to true, typing outside text areas and input boxes will - * automatically start searching for what's typed within the current - * document; when set to false, no search action happens - * ui.osk.enabled - * - when set to true, subject to other conditions, we may sometimes invoke - * an on-screen keyboard when a text input is focused. - * (Currently Windows-only, and depending on prefs, may be Windows-8-only) - * general.autoScroll - * - when set to true, clicking the scroll wheel on the mouse activates a - * mouse mode where moving the mouse down scrolls the document downward with - * speed correlated with the distance of the cursor from the original - * position at which the click occurred (and likewise with movement upward); - * if false, this behavior is disabled - * general.smoothScroll - * - set to true to enable finer page scrolling than line-by-line on page-up, - * page-down, and other such page movements - * layout.spellcheckDefault - * - an integer: - * 0 disables spellchecking - * 1 enables spellchecking, but only for multiline text fields - * 2 enables spellchecking for all text fields - */ - - /** - * Stores the original value of the spellchecking preference to enable proper - * restoration if unchanged (since we're mapping a tristate onto a checkbox). - */ - _storedSpellCheck: 0, - - /** - * Returns true if any spellchecking is enabled and false otherwise, caching - * the current value to enable proper pref restoration if the checkbox is - * never changed. - */ - readCheckSpelling() { - var pref = document.getElementById("layout.spellcheckDefault"); - this._storedSpellCheck = pref.value; - - return (pref.value != 0); - }, - - /** - * Returns the value of the spellchecking preference represented by UI, - * preserving the preference's "hidden" value if the preference is - * unchanged and represents a value not strictly allowed in UI. - */ - writeCheckSpelling() { - var checkbox = document.getElementById("checkSpelling"); - if (checkbox.checked) { - if (this._storedSpellCheck == 2) { - return 2; - } - return 1; - } - return 0; - }, - - /** - * security.OCSP.enabled is an integer value for legacy reasons. - * A value of 1 means OCSP is enabled. Any other value means it is disabled. - */ - readEnableOCSP() { - var preference = document.getElementById("security.OCSP.enabled"); - // This is the case if the preference is the default value. - if (preference.value === undefined) { - return true; - } - return preference.value == 1; - }, - - /** - * See documentation for readEnableOCSP. - */ - writeEnableOCSP() { - var checkbox = document.getElementById("enableOCSP"); - return checkbox.checked ? 1 : 0; - }, - - /** - * When the user toggles the layers.acceleration.disabled pref, - * sync its new value to the gfx.direct2d.disabled pref too. - */ - updateHardwareAcceleration() { - if (AppConstants.platform == "win") { - var fromPref = document.getElementById("layers.acceleration.disabled"); - var toPref = document.getElementById("gfx.direct2d.disabled"); - toPref.value = fromPref.value; - } - }, - - // DATA CHOICES TAB - - /** - * Set up or hide the Learn More links for various data collection options - */ - _setupLearnMoreLink(pref, element) { - // set up the Learn More link with the correct URL - let url = Services.prefs.getCharPref(pref); - let el = document.getElementById(element); - - if (url) { - el.setAttribute("href", url); - } else { - el.setAttribute("hidden", "true"); - } - }, - - /** - * - */ - initSubmitCrashes() { - this._setupLearnMoreLink("toolkit.crashreporter.infoURL", - "crashReporterLearnMore"); - }, - - /** - * The preference/checkbox is configured in XUL. - * - * In all cases, set up the Learn More link sanely. - */ - initTelemetry() { - if (AppConstants.MOZ_TELEMETRY_REPORTING) { - this._setupLearnMoreLink("toolkit.telemetry.infoURL", "telemetryLearnMore"); - } - }, - - /** - * Set the status of the telemetry controls based on the input argument. - * @param {Boolean} aEnabled False disables the controls, true enables them. - */ - setTelemetrySectionEnabled(aEnabled) { - if (AppConstants.MOZ_TELEMETRY_REPORTING) { - // If FHR is disabled, additional data sharing should be disabled as well. - let disabled = !aEnabled; - document.getElementById("submitTelemetryBox").disabled = disabled; - if (disabled) { - // If we disable FHR, untick the telemetry checkbox. - Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); - } - document.getElementById("telemetryDataDesc").disabled = disabled; - } - }, - - /** - * Initialize the health report service reference and checkbox. - */ - initSubmitHealthReport() { - if (AppConstants.MOZ_TELEMETRY_REPORTING) { - this._setupLearnMoreLink("datareporting.healthreport.infoURL", "FHRLearnMore"); - - let checkbox = document.getElementById("submitHealthReportBox"); - - if (Services.prefs.prefIsLocked(PREF_UPLOAD_ENABLED)) { - checkbox.setAttribute("disabled", "true"); - return; - } - - checkbox.checked = Services.prefs.getBoolPref(PREF_UPLOAD_ENABLED); - this.setTelemetrySectionEnabled(checkbox.checked); - } - }, - - /** - * Update the health report preference with state from checkbox. - */ - updateSubmitHealthReport() { - if (AppConstants.MOZ_TELEMETRY_REPORTING) { - let checkbox = document.getElementById("submitHealthReportBox"); - Services.prefs.setBoolPref(PREF_UPLOAD_ENABLED, checkbox.checked); - this.setTelemetrySectionEnabled(checkbox.checked); - } - }, - - updateOnScreenKeyboardVisibility() { - if (AppConstants.platform == "win") { - let minVersion = Services.prefs.getBoolPref("ui.osk.require_win10") ? 10 : 6.2; - if (Services.vc.compare(Services.sysinfo.getProperty("version"), minVersion) >= 0) { - document.getElementById("useOnScreenKeyboard").hidden = false; - } - } - }, - - // NETWORK TAB - - /* - * Preferences: - * - * browser.cache.disk.capacity - * - the size of the browser cache in KB - * - Only used if browser.cache.disk.smart_size.enabled is disabled - */ - - /** - * Displays a dialog in which proxy settings may be changed. - */ - showConnections() { - gSubDialog.open("chrome://browser/content/preferences/connection.xul"); - }, - - showSiteDataSettings() { - gSubDialog.open("chrome://browser/content/preferences/siteDataSettings.xul"); - }, - - updateTotalSiteDataSize() { - SiteDataManager.getTotalUsage() - .then(usage => { - let size = DownloadUtils.convertByteUnits(usage); - let prefStrBundle = document.getElementById("bundlePreferences"); - let totalSiteDataSizeLabel = document.getElementById("totalSiteDataSize"); - totalSiteDataSizeLabel.textContent = prefStrBundle.getFormattedString("totalSiteDataSize", size); - let siteDataGroup = document.getElementById("siteDataGroup"); - siteDataGroup.hidden = false; - }); - }, - - // Retrieves the amount of space currently used by disk cache - updateActualCacheSize() { - var actualSizeLabel = document.getElementById("actualDiskCacheSize"); - var prefStrBundle = document.getElementById("bundlePreferences"); - - // Needs to root the observer since cache service keeps only a weak reference. - this.observer = { - onNetworkCacheDiskConsumption(consumption) { - var size = DownloadUtils.convertByteUnits(consumption); - // The XBL binding for the string bundle may have been destroyed if - // the page was closed before this callback was executed. - if (!prefStrBundle.getFormattedString) { - return; - } - actualSizeLabel.value = prefStrBundle.getFormattedString("actualDiskCacheSize", size); - }, - - QueryInterface: XPCOMUtils.generateQI([ - Components.interfaces.nsICacheStorageConsumptionObserver, - Components.interfaces.nsISupportsWeakReference - ]) - }; - - actualSizeLabel.value = prefStrBundle.getString("actualDiskCacheSizeCalculated"); - - try { - var cacheService = - Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] - .getService(Components.interfaces.nsICacheStorageService); - cacheService.asyncGetDiskConsumption(this.observer); - } catch (e) {} - }, - - // Retrieves the amount of space currently used by offline cache - updateActualAppCacheSize() { - var visitor = { - onCacheStorageInfo(aEntryCount, aConsumption, aCapacity, aDiskDirectory) { - var actualSizeLabel = document.getElementById("actualAppCacheSize"); - var sizeStrings = DownloadUtils.convertByteUnits(aConsumption); - var prefStrBundle = document.getElementById("bundlePreferences"); - // The XBL binding for the string bundle may have been destroyed if - // the page was closed before this callback was executed. - if (!prefStrBundle.getFormattedString) { - return; - } - var sizeStr = prefStrBundle.getFormattedString("actualAppCacheSize", sizeStrings); - actualSizeLabel.value = sizeStr; - } - }; - - try { - var cacheService = - Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] - .getService(Components.interfaces.nsICacheStorageService); - var storage = cacheService.appCacheStorage(LoadContextInfo.default, null); - storage.asyncVisitStorage(visitor, false); - } catch (e) {} - }, - - updateCacheSizeUI(smartSizeEnabled) { - document.getElementById("useCacheBefore").disabled = smartSizeEnabled; - document.getElementById("cacheSize").disabled = smartSizeEnabled; - document.getElementById("useCacheAfter").disabled = smartSizeEnabled; - }, - - readSmartSizeEnabled() { - // The smart_size.enabled preference element is inverted="true", so its - // value is the opposite of the actual pref value - var disabled = document.getElementById("browser.cache.disk.smart_size.enabled").value; - this.updateCacheSizeUI(!disabled); - }, - - /** - * Converts the cache size from units of KB to units of MB and stores it in - * the textbox element. - */ - updateCacheSizeInputField() { - let cacheSizeElem = document.getElementById("cacheSize"); - let cachePref = document.getElementById("browser.cache.disk.capacity"); - cacheSizeElem.value = cachePref.value / 1024; - if (cachePref.locked) - cacheSizeElem.disabled = true; - }, - - /** - * Updates the cache size preference once user enters a new value. - * We intentionally do not set preference="browser.cache.disk.capacity" - * onto the textbox directly, as that would update the pref at each keypress - * not only after the final value is entered. - */ - updateCacheSizePref() { - let cacheSizeElem = document.getElementById("cacheSize"); - let cachePref = document.getElementById("browser.cache.disk.capacity"); - // Converts the cache size as specified in UI (in MB) to KB. - let intValue = parseInt(cacheSizeElem.value, 10); - cachePref.value = isNaN(intValue) ? 0 : intValue * 1024; - }, - - /** - * Clears the cache. - */ - clearCache() { - try { - var cache = Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] - .getService(Components.interfaces.nsICacheStorageService); - cache.clear(); - } catch (ex) {} - this.updateActualCacheSize(); - }, - - /** - * Clears the application cache. - */ - clearOfflineAppCache() { - Components.utils.import("resource:///modules/offlineAppCache.jsm"); - OfflineAppCacheHelper.clear(); - - this.updateActualAppCacheSize(); - this.updateOfflineApps(); - }, - - clearSiteData() { - let flags = - Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 + - Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1 + - Services.prompt.BUTTON_POS_0_DEFAULT; - let prefStrBundle = document.getElementById("bundlePreferences"); - let title = prefStrBundle.getString("clearSiteDataPromptTitle"); - let text = prefStrBundle.getString("clearSiteDataPromptText"); - let btn0Label = prefStrBundle.getString("clearSiteDataNow"); - - let result = Services.prompt.confirmEx( - window, title, text, flags, btn0Label, null, null, null, {}); - if (result == 0) { - SiteDataManager.removeAll(); - } - }, - - readOfflineNotify() { - var pref = document.getElementById("browser.offline-apps.notify"); - var button = document.getElementById("offlineNotifyExceptions"); - button.disabled = !pref.value; - return pref.value; - }, - - showOfflineExceptions() { - var bundlePreferences = document.getElementById("bundlePreferences"); - var params = { blockVisible: false, - sessionVisible: false, - allowVisible: false, - prefilledHost: "", - permissionType: "offline-app", - manageCapability: Components.interfaces.nsIPermissionManager.DENY_ACTION, - windowTitle: bundlePreferences.getString("offlinepermissionstitle"), - introText: bundlePreferences.getString("offlinepermissionstext") }; - gSubDialog.open("chrome://browser/content/preferences/permissions.xul", - null, params); - }, - - // XXX: duplicated in browser.js - _getOfflineAppUsage(perm, groups) { - let cacheService = Cc["@mozilla.org/network/application-cache-service;1"]. - getService(Ci.nsIApplicationCacheService); - if (!groups) { - try { - groups = cacheService.getGroups(); - } catch (ex) { - return 0; - } - } - - let usage = 0; - for (let group of groups) { - let uri = Services.io.newURI(group); - if (perm.matchesURI(uri, true)) { - let cache = cacheService.getActiveCache(group); - usage += cache.usage; - } - } - - return usage; - }, - - /** - * Updates the list of offline applications - */ - updateOfflineApps() { - var pm = Components.classes["@mozilla.org/permissionmanager;1"] - .getService(Components.interfaces.nsIPermissionManager); - - var list = document.getElementById("offlineAppsList"); - while (list.firstChild) { - list.firstChild.remove(); - } - - var groups; - try { - var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"]. - getService(Components.interfaces.nsIApplicationCacheService); - groups = cacheService.getGroups(); - } catch (e) { - return; - } - - var bundle = document.getElementById("bundlePreferences"); - - var enumerator = pm.enumerator; - while (enumerator.hasMoreElements()) { - var perm = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission); - if (perm.type == "offline-app" && - perm.capability != Components.interfaces.nsIPermissionManager.DEFAULT_ACTION && - perm.capability != Components.interfaces.nsIPermissionManager.DENY_ACTION) { - var row = document.createElement("listitem"); - row.id = ""; - row.className = "offlineapp"; - row.setAttribute("origin", perm.principal.origin); - var converted = DownloadUtils. - convertByteUnits(this._getOfflineAppUsage(perm, groups)); - row.setAttribute("usage", - bundle.getFormattedString("offlineAppUsage", - converted)); - list.appendChild(row); - } - } - }, - - offlineAppSelected() { - var removeButton = document.getElementById("offlineAppsListRemove"); - var list = document.getElementById("offlineAppsList"); - if (list.selectedItem) { - removeButton.setAttribute("disabled", "false"); - } else { - removeButton.setAttribute("disabled", "true"); - } - }, - - removeOfflineApp() { - var list = document.getElementById("offlineAppsList"); - var item = list.selectedItem; - var origin = item.getAttribute("origin"); - var principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin); - - var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] - .getService(Components.interfaces.nsIPromptService); - var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 + - prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1; - - var bundle = document.getElementById("bundlePreferences"); - var title = bundle.getString("offlineAppRemoveTitle"); - var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [principal.URI.prePath]); - var confirm = bundle.getString("offlineAppRemoveConfirm"); - var result = prompts.confirmEx(window, title, prompt, flags, confirm, - null, null, null, {}); - if (result != 0) - return; - - // get the permission - var pm = Components.classes["@mozilla.org/permissionmanager;1"] - .getService(Components.interfaces.nsIPermissionManager); - var perm = pm.getPermissionObject(principal, "offline-app", true); - if (perm) { - // clear offline cache entries - try { - var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"]. - getService(Components.interfaces.nsIApplicationCacheService); - var groups = cacheService.getGroups(); - for (var i = 0; i < groups.length; i++) { - var uri = Services.io.newURI(groups[i]); - if (perm.matchesURI(uri, true)) { - var cache = cacheService.getActiveCache(groups[i]); - cache.discard(); - } - } - } catch (e) {} - - pm.removePermission(perm); - } - list.removeChild(item); - gAdvancedPane.offlineAppSelected(); - this.updateActualAppCacheSize(); - }, - - // UPDATE TAB - - /* - * Preferences: - * - * app.update.enabled - * - true if updates to the application are enabled, false otherwise - * app.update.auto - * - true if updates should be automatically downloaded and installed and - * false if the user should be asked what he wants to do when an update is - * available - * extensions.update.enabled - * - true if updates to extensions and themes are enabled, false otherwise - * browser.search.update - * - true if updates to search engines are enabled, false otherwise - */ - - /** - * Selects the item of the radiogroup based on the pref values and locked - * states. - * - * UI state matrix for update preference conditions - * - * UI Components: Preferences - * Radiogroup i = app.update.enabled - * ii = app.update.auto - * - * Disabled states: - * Element pref value locked disabled - * radiogroup i t/f f false - * i t/f *t* *true* - * ii t/f f false - * ii t/f *t* *true* - */ - updateReadPrefs() { - if (AppConstants.MOZ_UPDATER) { - var enabledPref = document.getElementById("app.update.enabled"); - var autoPref = document.getElementById("app.update.auto"); - var radiogroup = document.getElementById("updateRadioGroup"); - - if (!enabledPref.value) // Don't care for autoPref.value in this case. - radiogroup.value = "manual"; // 3. Never check for updates. - else if (autoPref.value) // enabledPref.value && autoPref.value - radiogroup.value = "auto"; // 1. Automatically install updates - else // enabledPref.value && !autoPref.value - radiogroup.value = "checkOnly"; // 2. Check, but let me choose - - var canCheck = Components.classes["@mozilla.org/updates/update-service;1"]. - getService(Components.interfaces.nsIApplicationUpdateService). - canCheckForUpdates; - // canCheck is false if the enabledPref is false and locked, - // or the binary platform or OS version is not known. - // A locked pref is sufficient to disable the radiogroup. - radiogroup.disabled = !canCheck || enabledPref.locked || autoPref.locked; - - if (AppConstants.MOZ_MAINTENANCE_SERVICE) { - // Check to see if the maintenance service is installed. - // If it is don't show the preference at all. - var installed; - try { - var wrk = Components.classes["@mozilla.org/windows-registry-key;1"] - .createInstance(Components.interfaces.nsIWindowsRegKey); - wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE, - "SOFTWARE\\Mozilla\\MaintenanceService", - wrk.ACCESS_READ | wrk.WOW64_64); - installed = wrk.readIntValue("Installed"); - wrk.close(); - } catch (e) { - } - if (installed != 1) { - document.getElementById("useService").hidden = true; - } - } - } - }, - - /** - * Sets the pref values based on the selected item of the radiogroup. - */ - updateWritePrefs() { - if (AppConstants.MOZ_UPDATER) { - var enabledPref = document.getElementById("app.update.enabled"); - var autoPref = document.getElementById("app.update.auto"); - var radiogroup = document.getElementById("updateRadioGroup"); - switch (radiogroup.value) { - case "auto": // 1. Automatically install updates for Desktop only - enabledPref.value = true; - autoPref.value = true; - break; - case "checkOnly": // 2. Check, but let me choose - enabledPref.value = true; - autoPref.value = false; - break; - case "manual": // 3. Never check for updates. - enabledPref.value = false; - autoPref.value = false; - } - } - }, - - /** - * Displays the history of installed updates. - */ - showUpdates() { - gSubDialog.open("chrome://mozapps/content/update/history.xul"); - }, - - // ENCRYPTION TAB - - /* - * Preferences: - * - * security.default_personal_cert - * - a string: - * "Select Automatically" select a certificate automatically when a site - * requests one - * "Ask Every Time" present a dialog to the user so he can select - * the certificate to use on a site which - * requests one - */ - - /** - * Displays the user's certificates and associated options. - */ - showCertificates() { - gSubDialog.open("chrome://pippki/content/certManager.xul"); - }, - - /** - * Displays a dialog from which the user can manage his security devices. - */ - showSecurityDevices() { - gSubDialog.open("chrome://pippki/content/device_manager.xul"); - }, - - observe(aSubject, aTopic, aData) { - if (AppConstants.MOZ_UPDATER) { - switch (aTopic) { - case "nsPref:changed": - this.updateReadPrefs(); - break; - - case "sitedatamanager:sites-updated": - this.updateTotalSiteDataSize(); - break; - } - } - }, -}; diff --git a/browser/components/preferences/in-content-old/advanced.xul b/browser/components/preferences/in-content-old/advanced.xul deleted file mode 100644 index 523211ec74f2e..0000000000000 --- a/browser/components/preferences/in-content-old/advanced.xul +++ /dev/null @@ -1,436 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - - - - - - -

Site Data Test

- - - diff --git a/browser/components/preferences/in-content-old/tests/subdialog.xul b/browser/components/preferences/in-content-old/tests/subdialog.xul deleted file mode 100644 index 48d297b7373b2..0000000000000 --- a/browser/components/preferences/in-content-old/tests/subdialog.xul +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - A sample sub-dialog for testing - - - - - - diff --git a/browser/components/preferences/in-content-old/tests/subdialog2.xul b/browser/components/preferences/in-content-old/tests/subdialog2.xul deleted file mode 100644 index 89803c2503baf..0000000000000 --- a/browser/components/preferences/in-content-old/tests/subdialog2.xul +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - A sample sub-dialog for testing - - - - - - diff --git a/browser/components/preferences/moz.build b/browser/components/preferences/moz.build index ae79e6bf4e58b..49efefa37306f 100644 --- a/browser/components/preferences/moz.build +++ b/browser/components/preferences/moz.build @@ -4,14 +4,10 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -DIRS += [ - 'in-content-old', - 'in-content' -] +DIRS += ['in-content'] BROWSER_CHROME_MANIFESTS += [ - 'in-content-old/tests/browser.ini', - 'in-content/tests/browser.ini' + 'in-content/tests/browser.ini', ] for var in ('MOZ_APP_NAME', 'MOZ_MACBUNDLE_NAME'): diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn index 43e95b84a3ae4..85853adef06ea 100644 --- a/browser/installer/allowed-dupes.mn +++ b/browser/installer/allowed-dupes.mn @@ -10,17 +10,6 @@ LaunchServices/org.mozilla.updater updater.app/Contents/MacOS/org.mozilla.updater updater.app/Contents/PkgInfo browser/chrome.manifest -# browser preferences fork is bug 1349689 -browser/chrome/browser/content/preferences/in-content-old/advanced.js -browser/chrome/browser/content/preferences/in-content-old/applications.js -browser/chrome/browser/content/preferences/in-content-old/containers.js -browser/chrome/browser/content/preferences/in-content-old/content.js -browser/chrome/browser/content/preferences/in-content-old/main.js -browser/chrome/browser/content/preferences/in-content-old/preferences.js -browser/chrome/browser/content/preferences/in-content-old/privacy.js -browser/chrome/browser/content/preferences/in-content-old/search.js -browser/chrome/browser/content/preferences/in-content-old/security.js -browser/chrome/browser/content/preferences/in-content-old/sync.js # browser branding / themes is bug 1313106 browser/chrome/browser/content/branding/icon128.png browser/chrome/browser/content/branding/icon16.png diff --git a/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd b/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd deleted file mode 100644 index 4bf2723c434a2..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd deleted file mode 100644 index d2c76e63d7717..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties deleted file mode 100644 index 335363a662cfe..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -# LOCALIZATION NOTE -# in descriptionApplications, %S will be replaced by one of the 3 following strings -descriptionApplications=The following applications can be used to handle %S. - -handleProtocol=%S links -handleWebFeeds=Web Feeds -handleFile=%S content - -descriptionWebApp=This web application is hosted at: -descriptionLocalApp=This application is located at: diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd b/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd deleted file mode 100644 index ea89c3124466c..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd b/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd deleted file mode 100644 index 31a2986fe4570..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd b/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd deleted file mode 100644 index 153f68d7c90cd..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd b/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd deleted file mode 100644 index 850964a0fa7c2..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd b/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd deleted file mode 100644 index d715813548c5a..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/containers.properties b/browser/locales/en-US/chrome/browser/preferences-old/containers.properties deleted file mode 100644 index 6b78a9263fca2..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/containers.properties +++ /dev/null @@ -1,24 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -containers.labelMinWidth = 4rem -containers.updateContainerTitle = %S Container Preferences - -containers.blue.label = Blue -containers.turquoise.label = Turquoise -containers.green.label = Green -containers.yellow.label = Yellow -containers.orange.label = Orange -containers.red.label = Red -containers.pink.label = Pink -containers.purple.label = Purple - -containers.fingerprint.label = Fingerprint -containers.briefcase.label = Briefcase -# LOCALIZATION NOTE (containers.dollar.label) -# String represents a money sign but currently uses a dollar sign so don't change to local currency -# See Bug 1291672 -containers.dollar.label = Dollar sign -containers.cart.label = Shopping cart -containers.circle.label = Dot diff --git a/browser/locales/en-US/chrome/browser/preferences-old/content.dtd b/browser/locales/en-US/chrome/browser/preferences-old/content.dtd deleted file mode 100644 index c0d1c9f311dce..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/content.dtd +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd b/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd deleted file mode 100644 index e4d3a9b9ca70c..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd b/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd deleted file mode 100644 index 781fb53cd5b78..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd b/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd deleted file mode 100644 index cdf5c2ba786db..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd b/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd deleted file mode 100644 index ba5b11eb5fc19..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/main.dtd b/browser/locales/en-US/chrome/browser/preferences-old/main.dtd deleted file mode 100644 index 3085ffd0deadb..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/main.dtd +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd b/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd deleted file mode 100644 index e61228b76d156..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd b/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd deleted file mode 100644 index 380da71783630..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties b/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties deleted file mode 100644 index 2f2e1ab34929f..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties +++ /dev/null @@ -1,253 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#### Security - -# LOCALIZATION NOTE: phishBefore uses %S to represent the name of the provider -# whose privacy policy must be accepted (for enabling -# check-every-page-as-I-load-it phishing protection). -phishBeforeText=Selecting this option will send the address of web pages you are viewing to %S. To continue, please review and accept the following terms of service. - -#### Fonts - -labelDefaultFont=Default (%S) - -veryLargeMinimumFontTitle=Large minimum font size -veryLargeMinimumFontWarning=You have selected a very large minimum font size (more than 24 pixels). This may make it difficult or impossible to use some important configuration pages like this one. -acceptVeryLargeMinimumFont=Keep my changes anyway - -#### Permissions Manager - -trackingprotectionpermissionstext=You have disabled Tracking Protection on these sites. -trackingprotectionpermissionstitle=Exceptions - Tracking Protection -cookiepermissionstext=You can specify which websites are always or never allowed to use cookies. Type the exact address of the site you want to manage and then click Block, Allow for Session, or Allow. -cookiepermissionstitle=Exceptions - Cookies -addonspermissionstext=You can specify which websites are allowed to install add-ons. Type the exact address of the site you want to allow and then click Allow. -addons_permissions_title=Allowed Sites - Add-ons Installation -popuppermissionstext=You can specify which websites are allowed to open pop-up windows. Type the exact address of the site you want to allow and then click Allow. -popuppermissionstitle=Allowed Sites - Pop-ups -notificationspermissionstext4=Control which websites are always or never allowed to send you notifications. If you remove a site, it will need to request permission again. -notificationspermissionstitle=Notification Permissions -invalidURI=Please enter a valid hostname -invalidURITitle=Invalid Hostname Entered -savedLoginsExceptions_title=Exceptions - Saved Logins -savedLoginsExceptions_desc=Logins for the following sites will not be saved: - -#### Block List Manager - -blockliststext=You can choose which list Firefox will use to block Web elements that may track your browsing activity. -blockliststitle=Block Lists -# LOCALIZATION NOTE (mozNameTemplate): This template constructs the name of the -# block list in the block lists dialog. It combines the list name and -# description. -# e.g. mozNameTemplate : "Standard (Recommended). This list does a pretty good job." -# %1$S = list name (fooName), %2$S = list descriptive text (fooDesc) -mozNameTemplate=%1$S %2$S -# LOCALIZATION NOTE (mozstdName, etc.): These labels appear in the tracking -# protection block lists dialog, mozNameTemplate is used to create the final -# string. Note that in the future these two strings (name, desc) could be -# displayed on two different lines. -mozstdName=Disconnect.me basic protection (Recommended). -mozstdDesc=Allows some trackers so websites function properly. -mozfullName=Disconnect.me strict protection. -mozfullDesc=Blocks known trackers. Some sites may not function properly. -# LOCALIZATION NOTE (blocklistChangeRequiresRestart): %S = brandShortName -blocklistChangeRequiresRestart=%S must restart to change block lists. - -#### Master Password - -pw_change2empty_in_fips_mode=You are currently in FIPS mode. FIPS requires a non-empty Master Password. -pw_change_failed_title=Password Change Failed - -#### Fonts - -# LOCALIZATION NOTE: Next two strings are for language name representations with -# and without the region. -# e.g. languageRegionCodeFormat : "French/Canada [fr-ca]" languageCodeFormat : "French [fr]" -# %1$S = language name, %2$S = region name, %3$S = language-region code -languageRegionCodeFormat=%1$S/%2$S [%3$S] -# %1$S = language name, %2$S = language-region code -languageCodeFormat=%1$S [%2$S] - -#### Downloads - -desktopFolderName=Desktop -downloadsFolderName=Downloads -chooseDownloadFolderTitle=Choose Download Folder: - -#### Applications - -fileEnding=%S file -saveFile=Save File - -# LOCALIZATION NOTE (useApp, useDefault): %S = Application name -useApp=Use %S -useDefault=Use %S (default) - -useOtherApp=Use other… -fpTitleChooseApp=Select Helper Application -manageApp=Application Details… -webFeed=Web Feed -videoPodcastFeed=Video Podcast -audioPodcastFeed=Podcast -alwaysAsk=Always ask -portableDocumentFormat=Portable Document Format (PDF) - -# LOCALIZATION NOTE (usePluginIn): -# %1$S = plugin name (for example "QuickTime Plugin-in 7.2") -# %2$S = brandShortName from brand.properties (for example "Minefield") -usePluginIn=Use %S (in %S) - -# LOCALIZATION NOTE (previewInApp, addLiveBookmarksInApp): %S = brandShortName -previewInApp=Preview in %S -addLiveBookmarksInApp=Add Live Bookmarks in %S - -# LOCALIZATION NOTE (typeDescriptionWithType): -# %1$S = type description (for example "Portable Document Format") -# %2$S = type (for example "application/pdf") -typeDescriptionWithType=%S (%S) - - -#### Cookie Viewer - -hostColon=Host: -domainColon=Domain: -forSecureOnly=Encrypted connections only -forAnyConnection=Any type of connection -expireAtEndOfSession=At end of session -can=Allow -canAccessFirstParty=Allow first party only -canSession=Allow for Session -cannot=Block -noCookieSelected= -cookiesAll=The following cookies are stored on your computer: -cookiesFiltered=The following cookies match your search: - -# LOCALIZATION NOTE (removeAllCookies, removeAllShownCookies): -# removeAllCookies and removeAllShownCookies are both used on the same one button, -# never displayed together and can share the same accesskey. -# When only partial cookies are shown as a result of keyword search, -# removeAllShownCookies is displayed as button label. -# removeAllCookies is displayed when no keyword search and all cookies are shown. -removeAllCookies.label=Remove All -removeAllCookies.accesskey=A -removeAllShownCookies.label=Remove All Shown -removeAllShownCookies.accesskey=A - -# LOCALIZATION NOTE (removeSelectedCookies): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# If you need to display the number of selected elements in your language, -# you can use #1 in your localization as a placeholder for the number. -# For example this is the English string with numbers: -# removeSelectedCookied=Remove #1 Selected;Remove #1 Selected -removeSelectedCookies.label=Remove Selected;Remove Selected -removeSelectedCookies.accesskey=R - -defaultUserContextLabel=None - -#### Offline apps -offlineAppsList.height=7em -offlineAppRemoveTitle=Remove offline website data -offlineAppRemovePrompt=After removing this data, %S will not be available offline. Are you sure you want to remove this offline website? -offlineAppRemoveConfirm=Remove offline data - -# LOCALIZATION NOTE: The next string is for the disk usage of the -# offline application -# e.g. offlineAppUsage : "50.23 MB" -# %1$S = size (in bytes or megabytes, ...) -# %2$S = unit of measure (bytes, KB, MB, ...) -offlineAppUsage=%1$S %2$S - -offlinepermissionstext=The following websites are not allowed to store data for offline use: -offlinepermissionstitle=Offline Data - -####Preferences::Advanced::Network -#LOCALIZATION NOTE: The next string is for the disk usage of the web content cache. -# e.g., "Your web content cache is currently using 200 MB" -# %1$S = size -# %2$S = unit (MB, KB, etc.) -actualDiskCacheSize=Your web content cache is currently using %1$S %2$S of disk space -actualDiskCacheSizeCalculated=Calculating web content cache size… - -####Preferences::Advanced::Network -#LOCALIZATION NOTE: The next string is for the disk usage of the application cache. -# e.g., "Your application cache is currently using 200 MB" -# %1$S = size -# %2$S = unit (MB, KB, etc.) -actualAppCacheSize=Your application cache is currently using %1$S %2$S of disk space - -####Preferences::Advanced::Network -#LOCALIZATION NOTE: The next string is for the total usage of site data. -# e.g., "The total usage is currently using 200 MB" -# %1$S = size -# %2$S = unit (MB, KB, etc.) -totalSiteDataSize=Your stored site data is currently using %1$S %2$S of disk space -clearSiteDataPromptTitle=Clear all cookies and site data -clearSiteDataPromptText=Selecting ‘Clear Now’ will clear all cookies and site data stored by Firefox. This may sign you out of websites and remove offline web content. -clearSiteDataNow=Clear Now -important=Important -default=Default -siteUsage=%1$S %2$S -# LOCALIZATION NOTE (removeAllSiteData, removeAllSiteDataShown): -# removeAllSiteData and removeAllSiteDataShown are both used on the same one button, -# never displayed together and can share the same accesskey. -# When only partial sites are shown as a result of keyword search, -# removeAllShown is displayed as button label. -# removeAll is displayed when no keyword search and all sites are shown. -removeAllSiteData.label=Remove All -removeAllSiteData.accesskey=e -removeAllSiteDataShown.label=Remove All Shown -removeAllSiteDataShown.accesskey=e -spaceAlert.learnMoreButton.label=Learn More -spaceAlert.learnMoreButton.accesskey=L -spaceAlert.over5GB.prefButton.label=Open Preferences -spaceAlert.over5GB.prefButton.accesskey=O -# LOCALIZATION NOTE (spaceAlert.over5GB.prefButtonWin.label): On Windows Preferences is called Options -spaceAlert.over5GB.prefButtonWin.label=Open Options -spaceAlert.over5GB.prefButtonWin.accesskey=O -# LOCALIZATION NOTE (spaceAlert.over5GB.message): %S = brandShortName -spaceAlert.over5GB.message=%S is running out of disk space. Website contents may not display properly. You can clear stored site data in Preferences > Advanced > Site Data. -# LOCALIZATION NOTE (spaceAlert.over5GB.messageWin): -# - On Windows Preferences is called Options -# - %S = brandShortName -spaceAlert.over5GB.messageWin=%S is running out of disk space. Website contents may not display properly. You can clear stored site data in Options > Advanced > Site Data. -spaceAlert.under5GB.okButton.label=OK, Got it -spaceAlert.under5GB.okButton.accesskey=K -# LOCALIZATION NOTE (spaceAlert.under5GB.message): %S = brandShortName -spaceAlert.under5GB.message=%S is running out of disk space. Website contents may not display properly. Visit “Learn More” to optimize your disk usage for better browsing experience. - -# LOCALIZATION NOTE (featureEnableRequiresRestart, featureDisableRequiresRestart, restartTitle): %S = brandShortName -featureEnableRequiresRestart=%S must restart to enable this feature. -featureDisableRequiresRestart=%S must restart to disable this feature. -shouldRestartTitle=Restart %S -okToRestartButton=Restart %S now -revertNoRestartButton=Revert - -restartNow=Restart Now -restartLater=Restart Later - -disableContainersAlertTitle=Close All Container Tabs? - -# LOCALIZATION NOTE (disableContainersMsg): Semi-colon list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #S is the number of container tabs -disableContainersMsg=If you disable Container Tabs now, #S container tab will be closed. Are you sure you want to disable Container Tabs?;If you disable Container Tabs now, #S container tabs will be closed. Are you sure you want to disable Container Tabs? - -# LOCALIZATION NOTE (disableContainersOkButton): Semi-colon list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #S is the number of container tabs -disableContainersOkButton=Close #S Container Tab;Close #S Container Tabs - -disableContainersButton2=Keep enabled - -removeContainerAlertTitle=Remove This Container? - -# LOCALIZATION NOTE (removeContainerMsg): Semi-colon list of plural forms. -# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #S is the number of container tabs -removeContainerMsg=If you remove this Container now, #S container tab will be closed. Are you sure you want to remove this Container?;If you remove this Container now, #S container tabs will be closed. Are you sure you want to remove this Container? - -removeContainerOkButton=Remove this Container -removeContainerButton2=Don’t remove this Container diff --git a/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd b/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd deleted file mode 100644 index 4c38c111afcbc..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/search.dtd b/browser/locales/en-US/chrome/browser/preferences-old/search.dtd deleted file mode 100644 index 470933342aadc..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/search.dtd +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/security.dtd b/browser/locales/en-US/chrome/browser/preferences-old/security.dtd deleted file mode 100644 index cc067e40390d3..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/security.dtd +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd b/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd deleted file mode 100644 index a6082862addc2..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd b/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd deleted file mode 100644 index 51f523a06ed50..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd b/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd deleted file mode 100644 index 277d013ed5204..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd b/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd deleted file mode 100644 index 5b3dcd621c77f..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd b/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd deleted file mode 100644 index fc5fb2b7b6e62..0000000000000 --- a/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn index 02d0040e29fb9..b1edf111714f8 100644 --- a/browser/locales/jar.mn +++ b/browser/locales/jar.mn @@ -50,6 +50,7 @@ locale/browser/places/places.properties (%chrome/browser/places/places.properties) locale/browser/places/editBookmarkOverlay.dtd (%chrome/browser/places/editBookmarkOverlay.dtd) locale/browser/places/bookmarkProperties.properties (%chrome/browser/places/bookmarkProperties.properties) + locale/browser/preferences/selectBookmark.dtd (%chrome/browser/preferences/selectBookmark.dtd) locale/browser/places/moveBookmarks.dtd (%chrome/browser/places/moveBookmarks.dtd) locale/browser/safebrowsing/phishing-afterload-warning-message.dtd (%chrome/browser/safebrowsing/phishing-afterload-warning-message.dtd) locale/browser/safebrowsing/report-phishing.dtd (%chrome/browser/safebrowsing/report-phishing.dtd) @@ -58,57 +59,30 @@ locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/migration/migration.dtd (%chrome/browser/migration/migration.dtd) locale/browser/migration/migration.properties (%chrome/browser/migration/migration.properties) - locale/browser/preferences-old/advanced.dtd (%chrome/browser/preferences-old/advanced.dtd) locale/browser/preferences/advanced.dtd (%chrome/browser/preferences/advanced.dtd) - locale/browser/preferences-old/applicationManager.dtd (%chrome/browser/preferences-old/applicationManager.dtd) - locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd) - locale/browser/preferences-old/applicationManager.properties (%chrome/browser/preferences-old/applicationManager.properties) - locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) - locale/browser/preferences-old/applications.dtd (%chrome/browser/preferences-old/applications.dtd) - locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) - locale/browser/preferences-old/blocklists.dtd (%chrome/browser/preferences-old/blocklists.dtd) + locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd) + locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) locale/browser/preferences/blocklists.dtd (%chrome/browser/preferences/blocklists.dtd) - locale/browser/preferences-old/colors.dtd (%chrome/browser/preferences-old/colors.dtd) locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd) - locale/browser/preferences-old/connection.dtd (%chrome/browser/preferences-old/connection.dtd) - locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd) - locale/browser/preferences-old/containers.dtd (%chrome/browser/preferences-old/containers.dtd) - locale/browser/preferences/containers.dtd (%chrome/browser/preferences/containers.dtd) - locale/browser/preferences-old/containers.properties (%chrome/browser/preferences-old/containers.properties) - locale/browser/preferences/containers.properties (%chrome/browser/preferences/containers.properties) - locale/browser/preferences-old/content.dtd (%chrome/browser/preferences-old/content.dtd) - locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) - locale/browser/preferences-old/cookies.dtd (%chrome/browser/preferences-old/cookies.dtd) locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd) - locale/browser/preferences-old/donottrack.dtd (%chrome/browser/preferences-old/donottrack.dtd) + locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) + locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd) locale/browser/preferences/donottrack.dtd (%chrome/browser/preferences/donottrack.dtd) - locale/browser/preferences-old/fonts.dtd (%chrome/browser/preferences-old/fonts.dtd) + locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd) - locale/browser/preferences-old/languages.dtd (%chrome/browser/preferences-old/languages.dtd) - locale/browser/preferences/languages.dtd (%chrome/browser/preferences/languages.dtd) - locale/browser/preferences-old/main.dtd (%chrome/browser/preferences-old/main.dtd) locale/browser/preferences/main.dtd (%chrome/browser/preferences/main.dtd) - locale/browser/preferences-old/permissions.dtd (%chrome/browser/preferences-old/permissions.dtd) + locale/browser/preferences/languages.dtd (%chrome/browser/preferences/languages.dtd) locale/browser/preferences/permissions.dtd (%chrome/browser/preferences/permissions.dtd) - locale/browser/preferences-old/preferences.dtd (%chrome/browser/preferences-old/preferences.dtd) locale/browser/preferences/preferences.dtd (%chrome/browser/preferences/preferences.dtd) - locale/browser/preferences-old/preferences.properties (%chrome/browser/preferences-old/preferences.properties) - locale/browser/preferences/preferences.properties (%chrome/browser/preferences/preferences.properties) - locale/browser/preferences-old/privacy.dtd (%chrome/browser/preferences-old/privacy.dtd) + locale/browser/preferences/preferences.properties (%chrome/browser/preferences/preferences.properties) + locale/browser/preferences/containers.properties (%chrome/browser/preferences/containers.properties) locale/browser/preferences/privacy.dtd (%chrome/browser/preferences/privacy.dtd) - locale/browser/preferences-old/search.dtd (%chrome/browser/preferences-old/search.dtd) - locale/browser/preferences/search.dtd (%chrome/browser/preferences/search.dtd) - locale/browser/preferences-old/security.dtd (%chrome/browser/preferences-old/security.dtd) locale/browser/preferences/security.dtd (%chrome/browser/preferences/security.dtd) - locale/browser/preferences-old/selectBookmark.dtd (%chrome/browser/preferences-old/selectBookmark.dtd) - locale/browser/preferences/selectBookmark.dtd (%chrome/browser/preferences/selectBookmark.dtd) - locale/browser/preferences-old/siteDataSettings.dtd (%chrome/browser/preferences-old/siteDataSettings.dtd) - locale/browser/preferences/siteDataSettings.dtd (%chrome/browser/preferences/siteDataSettings.dtd) - locale/browser/preferences-old/sync.dtd (%chrome/browser/preferences-old/sync.dtd) + locale/browser/preferences/containers.dtd (%chrome/browser/preferences/containers.dtd) locale/browser/preferences/sync.dtd (%chrome/browser/preferences/sync.dtd) - locale/browser/preferences-old/tabs.dtd (%chrome/browser/preferences-old/tabs.dtd) locale/browser/preferences/tabs.dtd (%chrome/browser/preferences/tabs.dtd) - locale/browser/preferences-old/translation.dtd (%chrome/browser/preferences-old/translation.dtd) + locale/browser/preferences/search.dtd (%chrome/browser/preferences/search.dtd) + locale/browser/preferences/siteDataSettings.dtd (%chrome/browser/preferences/siteDataSettings.dtd) locale/browser/preferences/translation.dtd (%chrome/browser/preferences/translation.dtd) locale/browser/syncBrand.dtd (%chrome/browser/syncBrand.dtd) locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties) From d668a4c52d344c7a9ced012c0e61534dd20770f6 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 21 Mar 2017 13:11:06 -0500 Subject: [PATCH 011/300] Bug 1348562 - Remove unreferenced DevTools images. r=pbro MozReview-Commit-ID: 19etPrNlBrX --- .../test/static/browser_all_files_referenced.js | 9 --------- devtools/client/jar.mn | 4 ---- .../client/themes/images/debugging-devices.svg | 7 ------- devtools/client/themes/images/fast-forward.svg | 6 ------ .../client/themes/images/firebug/spinner.png | Bin 6125 -> 0 bytes devtools/client/themes/images/noise.png | Bin 2118 -> 0 bytes 6 files changed, 26 deletions(-) delete mode 100644 devtools/client/themes/images/debugging-devices.svg delete mode 100644 devtools/client/themes/images/fast-forward.svg delete mode 100644 devtools/client/themes/images/firebug/spinner.png delete mode 100644 devtools/client/themes/images/noise.png diff --git a/browser/base/content/test/static/browser_all_files_referenced.js b/browser/base/content/test/static/browser_all_files_referenced.js index e72d5d2d06038..e39c90202b673 100644 --- a/browser/base/content/test/static/browser_all_files_referenced.js +++ b/browser/base/content/test/static/browser_all_files_referenced.js @@ -169,15 +169,6 @@ var whitelist = new Set([ platforms: ["linux"]}, // Bug 1348559 {file: "chrome://pippki/content/resetpassword.xul"}, - // Bug 1348562 - {file: "chrome://devtools/skin/images/debugging-devices.svg", - isFromDevTools: true}, - {file: "chrome://devtools/skin/images/fast-forward.svg", - isFromDevTools: true}, - {file: "chrome://devtools/skin/images/firebug/spinner.png", - isFromDevTools: true}, - {file: "chrome://devtools/skin/images/noise.png", - isFromDevTools: true}, ].filter(item => ("isFromDevTools" in item) == isDevtools && diff --git a/devtools/client/jar.mn b/devtools/client/jar.mn index b68d20740c142..faf9d3daac3c6 100644 --- a/devtools/client/jar.mn +++ b/devtools/client/jar.mn @@ -174,13 +174,11 @@ devtools.jar: skin/images/item-arrow-dark-ltr.svg (themes/images/item-arrow-dark-ltr.svg) skin/images/item-arrow-rtl.svg (themes/images/item-arrow-rtl.svg) skin/images/item-arrow-ltr.svg (themes/images/item-arrow-ltr.svg) - skin/images/noise.png (themes/images/noise.png) skin/images/dropmarker.svg (themes/images/dropmarker.svg) skin/boxmodel.css (themes/boxmodel.css) skin/images/geometry-editor.svg (themes/images/geometry-editor.svg) skin/images/pause.svg (themes/images/pause.svg) skin/images/play.svg (themes/images/play.svg) - skin/images/fast-forward.svg (themes/images/fast-forward.svg) skin/images/rewind.svg (themes/images/rewind.svg) skin/images/debugger-step-in.svg (themes/images/debugger-step-in.svg) skin/images/debugger-step-out.svg (themes/images/debugger-step-out.svg) @@ -211,7 +209,6 @@ devtools.jar: skin/inspector.css (themes/inspector.css) skin/images/profiler-stopwatch.svg (themes/images/profiler-stopwatch.svg) skin/images/debugging-addons.svg (themes/images/debugging-addons.svg) - skin/images/debugging-devices.svg (themes/images/debugging-devices.svg) skin/images/debugging-tabs.svg (themes/images/debugging-tabs.svg) skin/images/debugging-workers.svg (themes/images/debugging-workers.svg) skin/images/globe.svg (themes/images/globe.svg) @@ -274,7 +271,6 @@ devtools.jar: # Firebug Theme skin/images/firebug/read-only.svg (themes/images/firebug/read-only.svg) - skin/images/firebug/spinner.png (themes/images/firebug/spinner.png) skin/images/firebug/twisty-closed-firebug.svg (themes/images/firebug/twisty-closed-firebug.svg) skin/images/firebug/twisty-open-firebug.svg (themes/images/firebug/twisty-open-firebug.svg) skin/images/firebug/arrow-down.svg (themes/images/firebug/arrow-down.svg) diff --git a/devtools/client/themes/images/debugging-devices.svg b/devtools/client/themes/images/debugging-devices.svg deleted file mode 100644 index be2cd5af614a6..0000000000000 --- a/devtools/client/themes/images/debugging-devices.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/devtools/client/themes/images/fast-forward.svg b/devtools/client/themes/images/fast-forward.svg deleted file mode 100644 index 813c672d82fe6..0000000000000 --- a/devtools/client/themes/images/fast-forward.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/devtools/client/themes/images/firebug/spinner.png b/devtools/client/themes/images/firebug/spinner.png deleted file mode 100644 index eec57a80962434f313b2ec53f4992568bd2c402d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6125 zcmZwLdpOf=9{}*5D9dp}j3|?*>`4wepBaidl!YhDd6CmF%&ABW3rU5XB5H*2I-f!! zs%1#1)(|l)BuNPGPjAnA`NOVjyMNcN?Y_3p@B6*K-}}CP*77tjmlziS0KBFqMi_A1 zzx{;l17F8(?Sq1YMv(FOpmToiK_M;yZh(QWC*CE8F^TV81 zn)KI^$G)P%F`4JntyRtLzBV^E@0D7EC@E3xmq!3Kv#BUqWn{^|ezWG32Onh->)$y6 zpqwSe)UJ~~e$TSVtDa85yb5h*NC8prXM)ZmRR*w5qH&AGwVUeVd>tE+TLr02BR;Bv z(<|$Qdb&+6lkxPHc5k;``bPOMtKrjnBzAat*sC^StkbnJw2ZYjq~Gb-%*f3H?*MZ0 zNl8iWb#kU>R?HU0N{Ah0;_gqoV_Ql*9QSFGU~>DjJ$ltT-R%t|8W6=*yH|&OQm17@ z$1gw>gT$Glu&Xi@!76*XK@VlL3`G_9g;qDmNv)zm5DUOpxUtnTr?$RF;o-K61d!`r zMmF$z7sjbmA7LP)sQX0&Yw#0$wka#UVzw#uMhLThLW~>|$}r*FOLj=6cyrKxh{Tt( z|B+A8;P2;~o9!#MJNeKseZDS;041fUnLJstj4c=a)^ivDI1Hj%7b>)SODzVzKoHB} zEsmy07~m`vhxnTkjHlB`(7c=_z0s8-H@gx3j;{kmM$XBu^sK@jU~JxB-3I_>o8nyH zj;R=@h*5bJBXe2m+M^OL_Dj&k3y{U56mw;2)t+twSHpeJEEELRw;1~57|C3YGO?(R zAbn9WdX1-BR>?N&@YCmhtOaT65NJzQS%n_(E(R9bdMQZ z1z8DAHkB)NCJ&d4pxryrm7ztga=bo$EijS|&;tLMAYl81;p;6myC2~TTjU1j z)v|jyVT^~KA1=t<#hM_SlPZq@>MyIlNNj#z-zc&zO#>rSj^v^~AEfDb)6FdSK)l|mzP$5mB>;_ z##Rs0Fgj(+*Cy0^%UO}l<;@G~v|7yUX>?dpOuO>|4g)EQH03Q4c8?no3|ov<44zq! zT;x7$bMDuiDE-_H%DuZ&PKiZCgOt2~qH^ChrH=RSs8q|%b&6l%MBndAvBV@iFoSB5 z6Jrb!eH6oZKFe5NR9sWY45q1uw!yi0m^6-skdkR36{jk__vNi-vH_vFm%w{3OR+aY z_Cgo=VS4MWR}GBv_Zc`N#)HMXS>>!&wlN$$Zc>5gOvLCY@RX}S<^#zk^m~L}v|vfe znqB(KLQmC{!WmuD+wvJvz6y4}e4=z91#YakcZY_Y46*AV4sl(q* zo_L&C(4fgnbZ~+o4nZq(Cc}J1<0@-qS#JnAYP3~;=9QQ5%gPo@cQH*;HZ~Fy>T*Pf zqNegu40=J?LhBgm3H#F)R@3<5^us=Ge+gui@8AQMtlg5DJE`0o4|T6SzF z_0{eZEhD2WM`wfnsDtgch^#S%jzKvDNn~2^wHhL2Z>_B0bKHvzgF&daJN3)!&gIQ! zMjV2p^32r}K$I+18g>B7viD{TVk?pq1(_fHTO3&rBHQHIoLlL0zIF7u=Gq^zWHBi* zb!IsnckU2}K|8z|h+@6>`N7pTt{z!4)Ec(HolI_AX)P(4l?MPH)$E&&6)QP~p0qSf z_xi>r8{Z?=njkPADr9U%3k#4D#R+u1yNwvPMyB07^BYdK4Bn4yt4Vmv)iw;q34Rh%zG&z0)WvR+G&1Ihj^GTh+xznVKFxjoHC zKuNwol05J=B- z40TT|mY0;AVSc<|CA3#*REy~wEqPuw6>|$Z&IS11kq(P@deA?enW;D1lj+r!?$H>i0HJ0;fAf=}ev?g} z;54!iFCBa(IgUjV4UFWCz7KlUg28;Vb>XTRvO))l>T$ji@SEgB_i7E5 zuFrarTOO)kzltmG@Z;UxZ|Z^WL(q@^k00N5B%biyV*m&G{Ni8!a^pxRK?Tr{d=xyC z3kq+uTYulvEE45>9LtehQ0nzJH2ZOMU*U_R(j<1-%=ejo=VOW=y(@C!08*r{qdFU8 z5-Mx!Jj--6nCWD7(}B0f)$h#_;~zAJ)w-TA!!`qT^DcK~a4u{NPX>r$5Ju*Z8TO|e zL7E#;dNJ)|dtrLisw6Nc#iy254_Z$LY4*+quj|(gm4&yomZFC~+*@fit{v*emJOAm zX^nD-&nBsu<7LaC)$c!U@ZUH!u@83G5K<~bJ^5V2i5uaYhN-}^{E%+)q_4_iHzMol za|(NacMB^Cio)E8F3hW=%wL`G3mEjVR7}WTw-zEFCpSTV2O$6MfZQr`79ilkKY-9} zz&`=F6~M`4xP4_yIQP71@95L03;AZ8`MUb?y80)zgsOr)2y&Ku5~#a;z7F`8(n5PM z?Zyg?qtw5wrr+e7w5=Wi04pI=Z#X{k`gT$juq$@-C9J)+~GPfllRVUGHr-33DW4vnYB?ZKC--NXAAKy7zyYJ9i!UK3<5R!sBZ<-Eg{}-siep7QDMb|!=a26Y z`8l|-a`>C})f3c{LARw>!D0h8o`LWB=YkhhvwL8R+7&bFn?B&8e$h^K0IPO9sZxVd zvwX(O3eD^!G8Az>k|gzC2i2MDTz9PUrAErh%LLV2n#a@q@4X7#8Pw5+eZ4Fkp(0FNtprD6HOpJ(1moP&V!* z>3IdD^j|14FY{MY;AW4;Rk65Fau(-`4;UMyVZugN42Frl zNtL~Yp0;>8*qM*UyPU^$CC114N@+ZIm#>}jpi(F&0rg_9Ozy&G87_yDseK`lj@*ExslfX>Jc-P0lp{k) zCO0T{J^rUOt?rF-n#1rM*f-lFmu-iaLu_oS3q9vyib`D^N4m}%K{DB&IzTxV{N<7- zM9P*=4-;?MfPElOM-elO-@iYg@yh)AX1YJED0$+GJR6{IV{@7EHmFlW4~lxSb=F}x z7f2e+c0_GJ0!% z)4oDvjpJ6dbMXVADz_QAh6eIp5l+sTloMwpXJ+pwW?u{rAWUOEq7KwcLMSOJ(jncH z^v>r7T#-ws0RZ$OI-KsxxQ_8U5CeFs@ zo)~WAaV;)L{FoFe2^i~K*|_vmCA()nNl`w#=crUz?o|+DHf%)W3#8*~a5Ll3IfRiD zy740zMaEXLX_$yFL7HG}jpZrpcOJlJ9lbsg`V6kMb}(8}{ZYv*+WQ_9T{-H~}i^fKu9Z^tP1yUhG=W!$>GUeOX0qZ=i}k*yg*ob@FTVC)X!5;=RqqQ=-E zvrsjHFqa%3qe{JITnw7fSBcaMdHI~fJ_s4P1TG`rwEv+sHpo)@;MJFsR;z||ZEc7W zarthnW$YkPCxmt*NwL@HdnLm+-YCec%)!=1Wr_?}>N*AZ3vje^|3VLZr(xHz!^GF* z>1sUv@i6ONN3yi3Z&snk4-zy2Iq3>6ibBSfk_Eaq3p~=?-jB7_y!Y9cvvk0)6TA(_ zjkKi-CY>_Ok8+}m)exO0?qL3=tv(r;5l15zYKIoEto)%h3_3HUnNc~a+*3cawjTyo zA0Ajy&Qe70(jhobr275qP2dwYxOJwz&2)$4!QCaf4!*h#N*?+Xk>Wcg1BSgD3VBmi ziO_cE;=s}S12^OxINI~aC6n#eIL6t@QV;LEv(Xf4&%b&9`Czd+#10+4D&H70c0bzi zcfmHj4e_2+?_Cl!`e@vF#^{Pn!Z;dzU7C8*rOW}2Tf?%BQQlt8D%7F8J?p)Z&RmUB z?CK(==mO$<4HV*?s^5PRhB+lE;y!rQg89Z&;HmhOHxtx!8#6Ctta#B%XpZeEuTQ08 zg%jIYv`y(?+Jriz$G!Rl5lJ~d8|L^_L(fk&dr8@%ZS$FjvL@I;w#riX&je`}V2Wk! zhjktgdWGCLg#-7?72p(H2wnSOi9T7XPctL(vtF_WvnZ)D0`18ITq1~1s6FHl(fg*c zPjiQ-#O|KV{s!>O?EjvJwmlIhooBaqg!GA)dP03HyNd!JN#au7~fxZZSdLbTJe%9>&uTJxZ#~FJ~q80AM+LUm%l!_>?0LZjdL#Hl4&^sPqrc z3h%~q^5}INIfXMTeqSR-=bGk&TO3D^m$SrD--t4=6pb#7o=;zPw;Ot=+{4|WpsUUl z#Mfd?y9tLxajA;IMo68%NIu?K!JNP)7r3q7f$9jdQ-tD+9iHG()^0rz*J*F?K#fi6 zPkc)5h)+F>fJSkP0aJ)cOgknX)vj^2Dd9n)Oau9j{Mc=T#1%jU79_wlM-{mj<4PL1 zP`6y`IOIZJE{o-GfVo}-04B)mso&5L0@h|Q*e=~EXX!Melh`(TDWT94%tcQj@R`C# z@Zhq%oW<#;0Ed$L-YWO#P^*0L^hob|dJA}5X$o0=3cvYQ+2WsErVfIX;sWo6!7K`A5*Dq(-Y>~ePv%ovsp+8Bb{cW zf^ZQH1}tZN|QscFP9}i+tTMrib}ZGFTn%a<%q3PS!$$}kOksz>7ED@DwD|3Vrj#+>dHj zQ(igiht@rs4(>}f^dt&g)A{$scvio!*^jtehaYuL;)kN-0e`Jb^Mu3C)Ppv-*PiKv Ogn+5BrBOM`Ir_ilmom@* diff --git a/devtools/client/themes/images/noise.png b/devtools/client/themes/images/noise.png deleted file mode 100644 index 01d340aaa9095a54d19071516cf9e0ca75b1f72e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2118 zcmV-M2)Xx(P)--?HvdIhUa_M+;X6tf#nR@I;yaMwDUa5OpE3_1&rij$kwgjpBQ zt3#iPRi|LEXk0XkRWCbQbWSK%v(W`v*6DR-WWA&6B3sSwR;^XR%$E8zr7dl#rkb`? z(w44iNhS4ZOV>EEr7d0Kvn_2Yr<%4jrIM~`OH;~8%ITV>w56I#x~3BAeymTUXV1R- z!%xrdKFhMvCpTADS?Ag8)!nmdHu|bDdh>@LI)AyTep!v46?ebWhn?zRF&$Uh!6)%-OV^a6H#IG(PdQCV+LE-SoJ#tTRoU55hu%pEm=+whIGYVRtX5g4(P`uT zqG+6~R@GwEn{65ehb^(n8eA06Xk|2dM@4pWbHW-RJ*s+xn+w6CStj0fPDU5m2SKtO z(fi-NOM0DNA1o*uqoQC#qdFPgbUK~t7H6H!kFD4%x%Z)@Eluf~N?MY%1pfOpC25M! z-n+F0=5y*(iPu}Kl2eISH9ZX$XMM1DRx}oaMW;7o)Y>#wcPBJavRTz*&>BM=#NDo7 z!l9&Mun-E9&2FJSy#|ZH9kU5%Yp73Fv<^1MkQllEuE+7imUeXX&a&0ytk+?V%MKbv zj@@QCwlanq^*ULraj_a@v&D>?)(2XvjEj?OHtC$4RD&~aHuN}Z6tm72`&>;%*$Y~Y zEL&xR&dn7EX)~zi*xUX$Ta7M?#-xi)9Arh0hPdc#Rh;FhIcJmegUwHyH4wl103BXr zlR3!J>Z~rR)yeGqUSFFo=(RfPyaW$Q^sHfr;_{m;>~gTfFsDAixeJCkH>Z+H+ESl# zx~3B6_m8#uw4^DOw56v5u3BeYtU8ydBxhN6)9N0~-s#xuqI7pm0ZR`MXS2J>(P2wx z1()BvXg_^48Bjx)_QwXjSusbO$wpc0?4pKH>|iK9G_s3X=N>zwy31y>YQ$)Wx}L4k z)CzwzvD^tT_r8mSLmDZi=D?#tKIrzKreP5q=vZWf(RF~~}=BFE!way01-u7Rx* zLR@sgkj2qaZzNPJ8v-teEj4;gIPD&*{_(C=(LNx!Gk*VkGAKHI$lvZEr;w1@&Bcn3 z_op>1`(NJl2H*W5d(->n&7XexTh{4(b9PYi(@oX*kL;T_XWtyX;$JGV;)|>7u%#W- zqdpQuAAaj`AK5t^SbUk)8O6ou6s}Q%u49m~vF^!En$i-UwKqCPn@hCnT`p?c{tp!I z_^a{UN2^Pcwp7!S4t?6G@^0}9=&wdET8*f zS!)mH@5b20k=sMBc6`+b?(CAgrSg#5fBs7lZ)fQi+Knzr=u z_VmpU#ZP~E)wzXYzH0obxXZFHK3OsPr19AeqsFsWZ@wsQp8f6BD?Tee8~xkS)9k3q zPBEq26*twO)fipOA=#6&_CdVHWYrt2CMEPWM}%9AQKmyp`C_NHpy5kgx>`LQ z19Y9)*%gaDt(7qKDR{6NT(ml;Fw`jwKD#SnN`0__>bx_#M&_T=5_8xRv)46{@NW4z z@YDas+AWw|l9(uJ%E5lAq$d$rb}f8)7&o-`LH1pZilg43bC0pNI9g2BDBaHXvjMHe z>M*6z$=#rOQO#~vr-#+=^0mJk9?QI6uIL}r#B3zUxJH<6eJHZ5RkgCC8+y0k^)42b zSiX(rXC;JtjSRle%h`*;If8LEI`pZA%pXW7VjS7*nI4_vqbX_B6zpx5xATw-!$Z z*bT2wWRW;d6j%F&mDEr7BA%CXX0RCCypJop^|xU-7nz+td%Bsz z?xqKYu8)+ogm}Ln*;93nke1Vyq-*L^j!d+L1^*ArT{Rc001R)MObuXVRU6W zV{&C-bY%cCFflSMFf%PNGE^}$IxsalF*qwQF*-0Xc5IQR0000bbVXQnWMOn=I&E)c wX=Zr Date: Wed, 22 Mar 2017 14:26:18 -0400 Subject: [PATCH 012/300] Bug 1347483 - blessings package should not be downloaded during mach virtualenv setup; r=mshal This fixes a regression introduced in Bug 1335873, which changes the mozbase packages.txt to call mozlog's setup.py. Calling setup.py registers the pytest_mozlog plugin for marionette-harness tests. Instead, we can register the pytest-mozlog plugin via command-line arguments to pytest, which are set in pytest.ini for the marionette-harness tests. As a result, we can revert the mozbase packages.txt to not refer to mozlog's setup.py I'm leaving the pytest entry-point in mozlog's setup.py so that external consumers don't have to register the pytest_mozlog plugin manually. MozReview-Commit-ID: I5wNq5H1x3X --- taskcluster/ci/source-test/python-tests.yml | 4 +++- .../marionette_harness/tests/harness_unit/pytest.ini | 7 +++++++ .../marionette_harness/tests/harness_unit/test_httpd.py | 2 +- .../tests/harness_unit/test_marionette_arguments.py | 2 +- .../tests/harness_unit/test_marionette_harness.py | 2 +- .../tests/harness_unit/test_marionette_runner.py | 2 +- .../tests/harness_unit/test_marionette_test_result.py | 2 +- .../marionette_harness/tests/harness_unit/test_serve.py | 2 +- testing/mozbase/packages.txt | 2 +- 9 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 testing/marionette/harness/marionette_harness/tests/harness_unit/pytest.ini diff --git a/taskcluster/ci/source-test/python-tests.yml b/taskcluster/ci/source-test/python-tests.yml index c913f4383e678..26a6a026932c7 100644 --- a/taskcluster/ci/source-test/python-tests.yml +++ b/taskcluster/ci/source-test/python-tests.yml @@ -47,7 +47,9 @@ marionette-harness: when: files-changed: - 'testing/marionette/harness/**' - - 'testing/mozbase/mozlog/mozlog/pytest_mozlog/**' + - 'testing/mozbase/mozlog/mozlog/**' + - 'testing/mozbase/mozlog/setup.py' + - 'testing/mozbase/packages.txt' - 'python/mach_commands.py' mozbase: diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/pytest.ini b/testing/marionette/harness/marionette_harness/tests/harness_unit/pytest.ini new file mode 100644 index 0000000000000..e3596c2512f87 --- /dev/null +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +# Early-load pytest_mozlog plugin to replace terminal reporter. +# Adding pytest_mozlog plugin to conftest.py registers the plugin +# too late for tests to recognize mozlog options. +# This manual registration of plugin is needed for running these +# tests in mach, whose virtualenv setup does not call mozlog's setup.py +addopts = -p mozlog.pytest_mozlog.plugin -p no:terminalreporter diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py index 40812103cf843..f6c0d1f506e66 100644 --- a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py @@ -88,4 +88,4 @@ def handler(request, response): if __name__ == "__main__": import sys sys.exit(pytest.main( - ['-p', 'no:terminalreporter', '--log-tbpl=-', __file__])) + ['--log-tbpl=-', __file__])) diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py index f2b4df4f34fa9..28250a4ff3189 100644 --- a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py @@ -30,4 +30,4 @@ def _is_float_convertible(value): if __name__ == '__main__': import sys sys.exit(pytest.main( - ['-p', 'no:terminalreporter', '--log-tbpl=-', __file__])) + ['--log-tbpl=-', __file__])) diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py index 1a20ce1dbe5e4..d0228fffa6f7a 100644 --- a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py @@ -106,4 +106,4 @@ def test_harness_sets_up_default_test_handlers(mach_parsed_kwargs): if __name__ == '__main__': import sys sys.exit(pytest.main( - ['-p', 'no:terminalreporter', '--log-tbpl=-', __file__])) + ['--log-tbpl=-', __file__])) diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py index 5b5933eb9bfbc..f309fe7a17345 100644 --- a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py @@ -440,4 +440,4 @@ def test_e10s_option_clash_raises(mock_runner): if __name__ == '__main__': import sys sys.exit(pytest.main( - ['-p', 'no:terminalreporter', '--log-tbpl=-', __file__])) + ['--log-tbpl=-', __file__])) diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py index 86b8bba832229..9f82b2da3d2fd 100644 --- a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py @@ -52,4 +52,4 @@ def test_crash_is_recorded_as_error(empty_marionette_test, if __name__ == '__main__': import sys sys.exit(pytest.main( - ['-p', 'no:terminalreporter', '--log-tbpl=-', __file__])) + ['--log-tbpl=-', __file__])) diff --git a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py index 7402482da77bc..aa02d41c46cc1 100644 --- a/testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py +++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py @@ -65,4 +65,4 @@ def test_where_is(): if __name__ == "__main__": import sys sys.exit(pytest.main( - ['-s', '-p', 'no:terminalreporter', '--log-tbpl=-', __file__])) + ['--log-tbpl=-', __file__])) diff --git a/testing/mozbase/packages.txt b/testing/mozbase/packages.txt index 8259149a7b48c..ba1f292ef38f1 100644 --- a/testing/mozbase/packages.txt +++ b/testing/mozbase/packages.txt @@ -8,7 +8,7 @@ mozhttpd.pth:testing/mozbase/mozhttpd mozinfo.pth:testing/mozbase/mozinfo mozinstall.pth:testing/mozbase/mozinstall mozleak.pth:testing/mozbase/mozleak -setup.py:testing/mozbase/mozlog:develop +mozlog.pth:testing/mozbase/mozlog moznetwork.pth:testing/mozbase/moznetwork mozprocess.pth:testing/mozbase/mozprocess mozprofile.pth:testing/mozbase/mozprofile From 0242430bd99f3227880ae9ed79c5f6a7914ee715 Mon Sep 17 00:00:00 2001 From: Jared Wein Date: Wed, 22 Mar 2017 16:56:25 -0400 Subject: [PATCH 013/300] Bug 1343682 - Create temporary killswitch for preference reorg. r=mconley This uses the pref browser.preferences.useOldOrganization=true to use the old prefs. MozReview-Commit-ID: DQyHYSZJTKd --- browser/components/about/AboutRedirector.cpp | 12 + browser/components/about/AboutRedirector.h | 3 + .../preferences/in-content-old/advanced.js | 798 +++++++ .../preferences/in-content-old/advanced.xul | 436 ++++ .../in-content-old/applications.js | 1897 +++++++++++++++++ .../in-content-old/applications.xul | 95 + .../preferences/in-content-old/containers.js | 99 + .../preferences/in-content-old/containers.xul | 54 + .../preferences/in-content-old/content.js | 283 +++ .../preferences/in-content-old/content.xul | 207 ++ .../preferences/in-content-old/jar.mn | 18 + .../preferences/in-content-old/main.js | 699 ++++++ .../preferences/in-content-old/main.xul | 301 +++ .../preferences/in-content-old/moz.build | 13 + .../preferences/in-content-old/preferences.js | 313 +++ .../in-content-old/preferences.xul | 224 ++ .../preferences/in-content-old/privacy.js | 698 ++++++ .../preferences/in-content-old/privacy.xul | 311 +++ .../preferences/in-content-old/search.js | 604 ++++++ .../preferences/in-content-old/search.xul | 86 + .../preferences/in-content-old/security.js | 292 +++ .../preferences/in-content-old/security.xul | 131 ++ .../preferences/in-content-old/subdialogs.js | 438 ++++ .../preferences/in-content-old/sync.js | 492 +++++ .../preferences/in-content-old/sync.xul | 225 ++ .../in-content-old/tests/.eslintrc.js | 7 + .../in-content-old/tests/browser.ini | 47 + .../tests/browser_advanced_siteData.js | 649 ++++++ .../tests/browser_advanced_update.js | 155 ++ .../tests/browser_applications_selection.js | 79 + .../tests/browser_basic_rebuild_fonts_test.js | 76 + .../browser_bug1018066_resetScrollPosition.js | 24 + ...g1020245_openPreferences_to_paneContent.js | 41 + ...vent_scrolling_when_preferences_flipped.js | 95 + ...ent_scrolling_when_preferences_flipped.xul | 33 + .../in-content-old/tests/browser_bug410900.js | 46 + .../in-content-old/tests/browser_bug705422.js | 144 ++ .../in-content-old/tests/browser_bug731866.js | 52 + .../tests/browser_bug795764_cachedisabled.js | 52 + .../tests/browser_change_app_handler.js | 98 + .../tests/browser_connection.js | 99 + .../tests/browser_connection_bug388287.js | 125 ++ .../tests/browser_cookies_exceptions.js | 351 +++ .../browser_defaultbrowser_alwayscheck.js | 103 + .../tests/browser_healthreport.js | 62 + ...owser_homepages_filter_aboutpreferences.js | 20 + .../browser_notifications_do_not_disturb.js | 44 + .../browser_permissions_urlFieldHidden.js | 45 + .../tests/browser_privacypane_1.js | 19 + .../tests/browser_privacypane_3.js | 18 + .../tests/browser_privacypane_4.js | 26 + .../tests/browser_privacypane_5.js | 18 + .../tests/browser_privacypane_8.js | 27 + .../tests/browser_proxy_backup.js | 65 + .../browser_sanitizeOnShutdown_prefLocked.js | 39 + .../tests/browser_searchsuggestions.js | 43 + .../in-content-old/tests/browser_security.js | 130 ++ .../tests/browser_subdialogs.js | 292 +++ .../in-content-old/tests/browser_telemetry.js | 52 + .../preferences/in-content-old/tests/head.js | 192 ++ .../tests/privacypane_tests_perwindow.js | 333 +++ .../in-content-old/tests/site_data_test.html | 29 + .../in-content-old/tests/subdialog.xul | 27 + .../in-content-old/tests/subdialog2.xul | 27 + browser/components/preferences/moz.build | 8 +- browser/installer/allowed-dupes.mn | 73 + .../browser/preferences-old/advanced.dtd | 127 ++ .../preferences-old/applicationManager.dtd | 8 + .../applicationManager.properties | 14 + .../browser/preferences-old/applications.dtd | 14 + .../browser/preferences-old/blocklists.dtd | 14 + .../chrome/browser/preferences-old/colors.dtd | 30 + .../browser/preferences-old/connection.dtd | 49 + .../browser/preferences-old/containers.dtd | 26 + .../preferences-old/containers.properties | 24 + .../browser/preferences-old/content.dtd | 60 + .../browser/preferences-old/cookies.dtd | 28 + .../browser/preferences-old/donottrack.dtd | 13 + .../chrome/browser/preferences-old/fonts.dtd | 107 + .../browser/preferences-old/languages.dtd | 18 + .../chrome/browser/preferences-old/main.dtd | 45 + .../browser/preferences-old/permissions.dtd | 28 + .../browser/preferences-old/preferences.dtd | 29 + .../preferences-old/preferences.properties | 253 +++ .../browser/preferences-old/privacy.dtd | 113 + .../chrome/browser/preferences-old/search.dtd | 29 + .../browser/preferences-old/security.dtd | 40 + .../preferences-old/selectBookmark.dtd | 9 + .../preferences-old/siteDataSettings.dtd | 20 + .../chrome/browser/preferences-old/sync.dtd | 86 + .../chrome/browser/preferences-old/tabs.dtd | 22 + .../browser/preferences-old/translation.dtd | 24 + browser/locales/jar.mn | 50 +- 93 files changed, 13860 insertions(+), 14 deletions(-) create mode 100644 browser/components/preferences/in-content-old/advanced.js create mode 100644 browser/components/preferences/in-content-old/advanced.xul create mode 100644 browser/components/preferences/in-content-old/applications.js create mode 100644 browser/components/preferences/in-content-old/applications.xul create mode 100644 browser/components/preferences/in-content-old/containers.js create mode 100644 browser/components/preferences/in-content-old/containers.xul create mode 100644 browser/components/preferences/in-content-old/content.js create mode 100644 browser/components/preferences/in-content-old/content.xul create mode 100644 browser/components/preferences/in-content-old/jar.mn create mode 100644 browser/components/preferences/in-content-old/main.js create mode 100644 browser/components/preferences/in-content-old/main.xul create mode 100644 browser/components/preferences/in-content-old/moz.build create mode 100644 browser/components/preferences/in-content-old/preferences.js create mode 100644 browser/components/preferences/in-content-old/preferences.xul create mode 100644 browser/components/preferences/in-content-old/privacy.js create mode 100644 browser/components/preferences/in-content-old/privacy.xul create mode 100644 browser/components/preferences/in-content-old/search.js create mode 100644 browser/components/preferences/in-content-old/search.xul create mode 100644 browser/components/preferences/in-content-old/security.js create mode 100644 browser/components/preferences/in-content-old/security.xul create mode 100644 browser/components/preferences/in-content-old/subdialogs.js create mode 100644 browser/components/preferences/in-content-old/sync.js create mode 100755 browser/components/preferences/in-content-old/sync.xul create mode 100644 browser/components/preferences/in-content-old/tests/.eslintrc.js create mode 100644 browser/components/preferences/in-content-old/tests/browser.ini create mode 100644 browser/components/preferences/in-content-old/tests/browser_advanced_siteData.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_advanced_update.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_applications_selection.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_basic_rebuild_fonts_test.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1018066_resetScrollPosition.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1020245_openPreferences_to_paneContent.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug1184989_prevent_scrolling_when_preferences_flipped.xul create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug410900.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug705422.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug731866.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_bug795764_cachedisabled.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_change_app_handler.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_connection.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_connection_bug388287.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_cookies_exceptions.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_defaultbrowser_alwayscheck.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_healthreport.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_homepages_filter_aboutpreferences.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_notifications_do_not_disturb.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_permissions_urlFieldHidden.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_1.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_3.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_4.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_5.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_privacypane_8.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_proxy_backup.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_sanitizeOnShutdown_prefLocked.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_searchsuggestions.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_security.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_subdialogs.js create mode 100644 browser/components/preferences/in-content-old/tests/browser_telemetry.js create mode 100644 browser/components/preferences/in-content-old/tests/head.js create mode 100644 browser/components/preferences/in-content-old/tests/privacypane_tests_perwindow.js create mode 100755 browser/components/preferences/in-content-old/tests/site_data_test.html create mode 100644 browser/components/preferences/in-content-old/tests/subdialog.xul create mode 100644 browser/components/preferences/in-content-old/tests/subdialog2.xul create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/applications.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/colors.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/connection.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/containers.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/containers.properties create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/content.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/languages.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/main.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/preferences.properties create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/search.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/security.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/sync.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd create mode 100644 browser/locales/en-US/chrome/browser/preferences-old/translation.dtd diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp index 0d1c6ea5af239..b9de6a3187226 100644 --- a/browser/components/about/AboutRedirector.cpp +++ b/browser/components/about/AboutRedirector.cpp @@ -13,6 +13,7 @@ #include "nsIScriptSecurityManager.h" #include "nsIProtocolHandler.h" #include "mozilla/ArrayUtils.h" +#include "mozilla/Preferences.h" #include "nsServiceManagerUtils.h" namespace mozilla { @@ -20,6 +21,8 @@ namespace browser { NS_IMPL_ISUPPORTS(AboutRedirector, nsIAboutModule) +bool AboutRedirector::sUseOldPreferences = false; + struct RedirEntry { const char* id; const char* url; @@ -138,6 +141,13 @@ AboutRedirector::NewChannel(nsIURI* aURI, nsCOMPtr ioService = do_GetIOService(&rv); NS_ENSURE_SUCCESS(rv, rv); + static bool sPrefCacheInited = false; + if (!sPrefCacheInited) { + Preferences::AddBoolVarCache(&sUseOldPreferences, + "browser.preferences.useOldOrganization"); + sPrefCacheInited = true; + } + for (auto & redir : kRedirMap) { if (!strcmp(path.get(), redir.id)) { nsAutoCString url; @@ -149,6 +159,8 @@ AboutRedirector::NewChannel(nsIURI* aURI, NS_ENSURE_SUCCESS(rv, rv); rv = aboutNewTabService->GetDefaultURL(url); NS_ENSURE_SUCCESS(rv, rv); + } else if (path.EqualsLiteral("preferences") && sUseOldPreferences) { + url.AssignASCII("chrome://browser/content/preferences/in-content-old/preferences.xul"); } // fall back to the specified url in the map if (url.IsEmpty()) { diff --git a/browser/components/about/AboutRedirector.h b/browser/components/about/AboutRedirector.h index 8feeb74912e56..eaf25e3400a99 100644 --- a/browser/components/about/AboutRedirector.h +++ b/browser/components/about/AboutRedirector.h @@ -24,6 +24,9 @@ class AboutRedirector : public nsIAboutModule protected: virtual ~AboutRedirector() {} + +private: + static bool sUseOldPreferences; }; } // namespace browser diff --git a/browser/components/preferences/in-content-old/advanced.js b/browser/components/preferences/in-content-old/advanced.js new file mode 100644 index 0000000000000..bfd4505c6d6a8 --- /dev/null +++ b/browser/components/preferences/in-content-old/advanced.js @@ -0,0 +1,798 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* import-globals-from preferences.js */ + +// Load DownloadUtils module for convertByteUnits +Components.utils.import("resource://gre/modules/DownloadUtils.jsm"); +Components.utils.import("resource://gre/modules/LoadContextInfo.jsm"); +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "SiteDataManager", + "resource:///modules/SiteDataManager.jsm"); + +const PREF_UPLOAD_ENABLED = "datareporting.healthreport.uploadEnabled"; + +var gAdvancedPane = { + _inited: false, + + /** + * Brings the appropriate tab to the front and initializes various bits of UI. + */ + init() { + function setEventListener(aId, aEventType, aCallback) { + document.getElementById(aId) + .addEventListener(aEventType, aCallback.bind(gAdvancedPane)); + } + + this._inited = true; + var advancedPrefs = document.getElementById("advancedPrefs"); + + var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex"); + if (preference.value !== null) + advancedPrefs.selectedIndex = preference.value; + + if (AppConstants.MOZ_UPDATER) { + let onUnload = function() { + window.removeEventListener("unload", onUnload); + Services.prefs.removeObserver("app.update.", this); + }.bind(this); + window.addEventListener("unload", onUnload); + Services.prefs.addObserver("app.update.", this, false); + this.updateReadPrefs(); + } + this.updateOfflineApps(); + if (AppConstants.MOZ_CRASHREPORTER) { + this.initSubmitCrashes(); + } + this.initTelemetry(); + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + this.initSubmitHealthReport(); + } + this.updateOnScreenKeyboardVisibility(); + this.updateCacheSizeInputField(); + this.updateActualCacheSize(); + this.updateActualAppCacheSize(); + + if (Services.prefs.getBoolPref("browser.storageManager.enabled")) { + Services.obs.addObserver(this, "sitedatamanager:sites-updated", false); + let unload = () => { + window.removeEventListener("unload", unload); + Services.obs.removeObserver(this, "sitedatamanager:sites-updated"); + }; + window.addEventListener("unload", unload); + SiteDataManager.updateSites(); + setEventListener("clearSiteDataButton", "command", + gAdvancedPane.clearSiteData); + setEventListener("siteDataSettings", "command", + gAdvancedPane.showSiteDataSettings); + + let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "storage-permissions"; + document.getElementById("siteDataLearnMoreLink").setAttribute("href", url); + } + + setEventListener("layers.acceleration.disabled", "change", + gAdvancedPane.updateHardwareAcceleration); + setEventListener("advancedPrefs", "select", + gAdvancedPane.tabSelectionChanged); + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + setEventListener("submitHealthReportBox", "command", + gAdvancedPane.updateSubmitHealthReport); + } + + setEventListener("connectionSettings", "command", + gAdvancedPane.showConnections); + setEventListener("clearCacheButton", "command", + gAdvancedPane.clearCache); + setEventListener("clearOfflineAppCacheButton", "command", + gAdvancedPane.clearOfflineAppCache); + setEventListener("offlineNotifyExceptions", "command", + gAdvancedPane.showOfflineExceptions); + setEventListener("offlineAppsList", "select", + gAdvancedPane.offlineAppSelected); + let bundlePrefs = document.getElementById("bundlePreferences"); + document.getElementById("offlineAppsList") + .style.height = bundlePrefs.getString("offlineAppsList.height"); + setEventListener("offlineAppsListRemove", "command", + gAdvancedPane.removeOfflineApp); + if (AppConstants.MOZ_UPDATER) { + setEventListener("updateRadioGroup", "command", + gAdvancedPane.updateWritePrefs); + setEventListener("showUpdateHistory", "command", + gAdvancedPane.showUpdates); + } + setEventListener("viewCertificatesButton", "command", + gAdvancedPane.showCertificates); + setEventListener("viewSecurityDevicesButton", "command", + gAdvancedPane.showSecurityDevices); + setEventListener("cacheSize", "change", + gAdvancedPane.updateCacheSizePref); + + if (AppConstants.MOZ_WIDGET_GTK) { + // GTK tabbox' allow the scroll wheel to change the selected tab, + // but we don't want this behavior for the in-content preferences. + let tabsElement = document.getElementById("tabsElement"); + tabsElement.addEventListener("DOMMouseScroll", event => { + event.stopPropagation(); + }, true); + } + }, + + /** + * Stores the identity of the current tab in preferences so that the selected + * tab can be persisted between openings of the preferences window. + */ + tabSelectionChanged() { + if (!this._inited) + return; + var advancedPrefs = document.getElementById("advancedPrefs"); + var preference = document.getElementById("browser.preferences.advanced.selectedTabIndex"); + + // tabSelectionChanged gets called twice due to the selectedIndex being set + // by both the selectedItem and selectedPanel callstacks. This guard is used + // to prevent double-counting in Telemetry. + if (preference.valueFromPreferences != advancedPrefs.selectedIndex) { + Services.telemetry + .getHistogramById("FX_PREFERENCES_CATEGORY_OPENED") + .add(telemetryBucketForCategory("advanced")); + } + + preference.valueFromPreferences = advancedPrefs.selectedIndex; + }, + + // GENERAL TAB + + /* + * Preferences: + * + * accessibility.browsewithcaret + * - true enables keyboard navigation and selection within web pages using a + * visible caret, false uses normal keyboard navigation with no caret + * accessibility.typeaheadfind + * - when set to true, typing outside text areas and input boxes will + * automatically start searching for what's typed within the current + * document; when set to false, no search action happens + * ui.osk.enabled + * - when set to true, subject to other conditions, we may sometimes invoke + * an on-screen keyboard when a text input is focused. + * (Currently Windows-only, and depending on prefs, may be Windows-8-only) + * general.autoScroll + * - when set to true, clicking the scroll wheel on the mouse activates a + * mouse mode where moving the mouse down scrolls the document downward with + * speed correlated with the distance of the cursor from the original + * position at which the click occurred (and likewise with movement upward); + * if false, this behavior is disabled + * general.smoothScroll + * - set to true to enable finer page scrolling than line-by-line on page-up, + * page-down, and other such page movements + * layout.spellcheckDefault + * - an integer: + * 0 disables spellchecking + * 1 enables spellchecking, but only for multiline text fields + * 2 enables spellchecking for all text fields + */ + + /** + * Stores the original value of the spellchecking preference to enable proper + * restoration if unchanged (since we're mapping a tristate onto a checkbox). + */ + _storedSpellCheck: 0, + + /** + * Returns true if any spellchecking is enabled and false otherwise, caching + * the current value to enable proper pref restoration if the checkbox is + * never changed. + */ + readCheckSpelling() { + var pref = document.getElementById("layout.spellcheckDefault"); + this._storedSpellCheck = pref.value; + + return (pref.value != 0); + }, + + /** + * Returns the value of the spellchecking preference represented by UI, + * preserving the preference's "hidden" value if the preference is + * unchanged and represents a value not strictly allowed in UI. + */ + writeCheckSpelling() { + var checkbox = document.getElementById("checkSpelling"); + if (checkbox.checked) { + if (this._storedSpellCheck == 2) { + return 2; + } + return 1; + } + return 0; + }, + + /** + * security.OCSP.enabled is an integer value for legacy reasons. + * A value of 1 means OCSP is enabled. Any other value means it is disabled. + */ + readEnableOCSP() { + var preference = document.getElementById("security.OCSP.enabled"); + // This is the case if the preference is the default value. + if (preference.value === undefined) { + return true; + } + return preference.value == 1; + }, + + /** + * See documentation for readEnableOCSP. + */ + writeEnableOCSP() { + var checkbox = document.getElementById("enableOCSP"); + return checkbox.checked ? 1 : 0; + }, + + /** + * When the user toggles the layers.acceleration.disabled pref, + * sync its new value to the gfx.direct2d.disabled pref too. + */ + updateHardwareAcceleration() { + if (AppConstants.platform == "win") { + var fromPref = document.getElementById("layers.acceleration.disabled"); + var toPref = document.getElementById("gfx.direct2d.disabled"); + toPref.value = fromPref.value; + } + }, + + // DATA CHOICES TAB + + /** + * Set up or hide the Learn More links for various data collection options + */ + _setupLearnMoreLink(pref, element) { + // set up the Learn More link with the correct URL + let url = Services.prefs.getCharPref(pref); + let el = document.getElementById(element); + + if (url) { + el.setAttribute("href", url); + } else { + el.setAttribute("hidden", "true"); + } + }, + + /** + * + */ + initSubmitCrashes() { + this._setupLearnMoreLink("toolkit.crashreporter.infoURL", + "crashReporterLearnMore"); + }, + + /** + * The preference/checkbox is configured in XUL. + * + * In all cases, set up the Learn More link sanely. + */ + initTelemetry() { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + this._setupLearnMoreLink("toolkit.telemetry.infoURL", "telemetryLearnMore"); + } + }, + + /** + * Set the status of the telemetry controls based on the input argument. + * @param {Boolean} aEnabled False disables the controls, true enables them. + */ + setTelemetrySectionEnabled(aEnabled) { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + // If FHR is disabled, additional data sharing should be disabled as well. + let disabled = !aEnabled; + document.getElementById("submitTelemetryBox").disabled = disabled; + if (disabled) { + // If we disable FHR, untick the telemetry checkbox. + Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); + } + document.getElementById("telemetryDataDesc").disabled = disabled; + } + }, + + /** + * Initialize the health report service reference and checkbox. + */ + initSubmitHealthReport() { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + this._setupLearnMoreLink("datareporting.healthreport.infoURL", "FHRLearnMore"); + + let checkbox = document.getElementById("submitHealthReportBox"); + + if (Services.prefs.prefIsLocked(PREF_UPLOAD_ENABLED)) { + checkbox.setAttribute("disabled", "true"); + return; + } + + checkbox.checked = Services.prefs.getBoolPref(PREF_UPLOAD_ENABLED); + this.setTelemetrySectionEnabled(checkbox.checked); + } + }, + + /** + * Update the health report preference with state from checkbox. + */ + updateSubmitHealthReport() { + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + let checkbox = document.getElementById("submitHealthReportBox"); + Services.prefs.setBoolPref(PREF_UPLOAD_ENABLED, checkbox.checked); + this.setTelemetrySectionEnabled(checkbox.checked); + } + }, + + updateOnScreenKeyboardVisibility() { + if (AppConstants.platform == "win") { + let minVersion = Services.prefs.getBoolPref("ui.osk.require_win10") ? 10 : 6.2; + if (Services.vc.compare(Services.sysinfo.getProperty("version"), minVersion) >= 0) { + document.getElementById("useOnScreenKeyboard").hidden = false; + } + } + }, + + // NETWORK TAB + + /* + * Preferences: + * + * browser.cache.disk.capacity + * - the size of the browser cache in KB + * - Only used if browser.cache.disk.smart_size.enabled is disabled + */ + + /** + * Displays a dialog in which proxy settings may be changed. + */ + showConnections() { + gSubDialog.open("chrome://browser/content/preferences/connection.xul"); + }, + + showSiteDataSettings() { + gSubDialog.open("chrome://browser/content/preferences/siteDataSettings.xul"); + }, + + updateTotalSiteDataSize() { + SiteDataManager.getTotalUsage() + .then(usage => { + let size = DownloadUtils.convertByteUnits(usage); + let prefStrBundle = document.getElementById("bundlePreferences"); + let totalSiteDataSizeLabel = document.getElementById("totalSiteDataSize"); + totalSiteDataSizeLabel.textContent = prefStrBundle.getFormattedString("totalSiteDataSize", size); + let siteDataGroup = document.getElementById("siteDataGroup"); + siteDataGroup.hidden = false; + }); + }, + + // Retrieves the amount of space currently used by disk cache + updateActualCacheSize() { + var actualSizeLabel = document.getElementById("actualDiskCacheSize"); + var prefStrBundle = document.getElementById("bundlePreferences"); + + // Needs to root the observer since cache service keeps only a weak reference. + this.observer = { + onNetworkCacheDiskConsumption(consumption) { + var size = DownloadUtils.convertByteUnits(consumption); + // The XBL binding for the string bundle may have been destroyed if + // the page was closed before this callback was executed. + if (!prefStrBundle.getFormattedString) { + return; + } + actualSizeLabel.value = prefStrBundle.getFormattedString("actualDiskCacheSize", size); + }, + + QueryInterface: XPCOMUtils.generateQI([ + Components.interfaces.nsICacheStorageConsumptionObserver, + Components.interfaces.nsISupportsWeakReference + ]) + }; + + actualSizeLabel.value = prefStrBundle.getString("actualDiskCacheSizeCalculated"); + + try { + var cacheService = + Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] + .getService(Components.interfaces.nsICacheStorageService); + cacheService.asyncGetDiskConsumption(this.observer); + } catch (e) {} + }, + + // Retrieves the amount of space currently used by offline cache + updateActualAppCacheSize() { + var visitor = { + onCacheStorageInfo(aEntryCount, aConsumption, aCapacity, aDiskDirectory) { + var actualSizeLabel = document.getElementById("actualAppCacheSize"); + var sizeStrings = DownloadUtils.convertByteUnits(aConsumption); + var prefStrBundle = document.getElementById("bundlePreferences"); + // The XBL binding for the string bundle may have been destroyed if + // the page was closed before this callback was executed. + if (!prefStrBundle.getFormattedString) { + return; + } + var sizeStr = prefStrBundle.getFormattedString("actualAppCacheSize", sizeStrings); + actualSizeLabel.value = sizeStr; + } + }; + + try { + var cacheService = + Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] + .getService(Components.interfaces.nsICacheStorageService); + var storage = cacheService.appCacheStorage(LoadContextInfo.default, null); + storage.asyncVisitStorage(visitor, false); + } catch (e) {} + }, + + updateCacheSizeUI(smartSizeEnabled) { + document.getElementById("useCacheBefore").disabled = smartSizeEnabled; + document.getElementById("cacheSize").disabled = smartSizeEnabled; + document.getElementById("useCacheAfter").disabled = smartSizeEnabled; + }, + + readSmartSizeEnabled() { + // The smart_size.enabled preference element is inverted="true", so its + // value is the opposite of the actual pref value + var disabled = document.getElementById("browser.cache.disk.smart_size.enabled").value; + this.updateCacheSizeUI(!disabled); + }, + + /** + * Converts the cache size from units of KB to units of MB and stores it in + * the textbox element. + */ + updateCacheSizeInputField() { + let cacheSizeElem = document.getElementById("cacheSize"); + let cachePref = document.getElementById("browser.cache.disk.capacity"); + cacheSizeElem.value = cachePref.value / 1024; + if (cachePref.locked) + cacheSizeElem.disabled = true; + }, + + /** + * Updates the cache size preference once user enters a new value. + * We intentionally do not set preference="browser.cache.disk.capacity" + * onto the textbox directly, as that would update the pref at each keypress + * not only after the final value is entered. + */ + updateCacheSizePref() { + let cacheSizeElem = document.getElementById("cacheSize"); + let cachePref = document.getElementById("browser.cache.disk.capacity"); + // Converts the cache size as specified in UI (in MB) to KB. + let intValue = parseInt(cacheSizeElem.value, 10); + cachePref.value = isNaN(intValue) ? 0 : intValue * 1024; + }, + + /** + * Clears the cache. + */ + clearCache() { + try { + var cache = Components.classes["@mozilla.org/netwerk/cache-storage-service;1"] + .getService(Components.interfaces.nsICacheStorageService); + cache.clear(); + } catch (ex) {} + this.updateActualCacheSize(); + }, + + /** + * Clears the application cache. + */ + clearOfflineAppCache() { + Components.utils.import("resource:///modules/offlineAppCache.jsm"); + OfflineAppCacheHelper.clear(); + + this.updateActualAppCacheSize(); + this.updateOfflineApps(); + }, + + clearSiteData() { + let flags = + Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 + + Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1 + + Services.prompt.BUTTON_POS_0_DEFAULT; + let prefStrBundle = document.getElementById("bundlePreferences"); + let title = prefStrBundle.getString("clearSiteDataPromptTitle"); + let text = prefStrBundle.getString("clearSiteDataPromptText"); + let btn0Label = prefStrBundle.getString("clearSiteDataNow"); + + let result = Services.prompt.confirmEx( + window, title, text, flags, btn0Label, null, null, null, {}); + if (result == 0) { + SiteDataManager.removeAll(); + } + }, + + readOfflineNotify() { + var pref = document.getElementById("browser.offline-apps.notify"); + var button = document.getElementById("offlineNotifyExceptions"); + button.disabled = !pref.value; + return pref.value; + }, + + showOfflineExceptions() { + var bundlePreferences = document.getElementById("bundlePreferences"); + var params = { blockVisible: false, + sessionVisible: false, + allowVisible: false, + prefilledHost: "", + permissionType: "offline-app", + manageCapability: Components.interfaces.nsIPermissionManager.DENY_ACTION, + windowTitle: bundlePreferences.getString("offlinepermissionstitle"), + introText: bundlePreferences.getString("offlinepermissionstext") }; + gSubDialog.open("chrome://browser/content/preferences/permissions.xul", + null, params); + }, + + // XXX: duplicated in browser.js + _getOfflineAppUsage(perm, groups) { + let cacheService = Cc["@mozilla.org/network/application-cache-service;1"]. + getService(Ci.nsIApplicationCacheService); + if (!groups) { + try { + groups = cacheService.getGroups(); + } catch (ex) { + return 0; + } + } + + let usage = 0; + for (let group of groups) { + let uri = Services.io.newURI(group); + if (perm.matchesURI(uri, true)) { + let cache = cacheService.getActiveCache(group); + usage += cache.usage; + } + } + + return usage; + }, + + /** + * Updates the list of offline applications + */ + updateOfflineApps() { + var pm = Components.classes["@mozilla.org/permissionmanager;1"] + .getService(Components.interfaces.nsIPermissionManager); + + var list = document.getElementById("offlineAppsList"); + while (list.firstChild) { + list.firstChild.remove(); + } + + var groups; + try { + var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"]. + getService(Components.interfaces.nsIApplicationCacheService); + groups = cacheService.getGroups(); + } catch (e) { + return; + } + + var bundle = document.getElementById("bundlePreferences"); + + var enumerator = pm.enumerator; + while (enumerator.hasMoreElements()) { + var perm = enumerator.getNext().QueryInterface(Components.interfaces.nsIPermission); + if (perm.type == "offline-app" && + perm.capability != Components.interfaces.nsIPermissionManager.DEFAULT_ACTION && + perm.capability != Components.interfaces.nsIPermissionManager.DENY_ACTION) { + var row = document.createElement("listitem"); + row.id = ""; + row.className = "offlineapp"; + row.setAttribute("origin", perm.principal.origin); + var converted = DownloadUtils. + convertByteUnits(this._getOfflineAppUsage(perm, groups)); + row.setAttribute("usage", + bundle.getFormattedString("offlineAppUsage", + converted)); + list.appendChild(row); + } + } + }, + + offlineAppSelected() { + var removeButton = document.getElementById("offlineAppsListRemove"); + var list = document.getElementById("offlineAppsList"); + if (list.selectedItem) { + removeButton.setAttribute("disabled", "false"); + } else { + removeButton.setAttribute("disabled", "true"); + } + }, + + removeOfflineApp() { + var list = document.getElementById("offlineAppsList"); + var item = list.selectedItem; + var origin = item.getAttribute("origin"); + var principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(origin); + + var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] + .getService(Components.interfaces.nsIPromptService); + var flags = prompts.BUTTON_TITLE_IS_STRING * prompts.BUTTON_POS_0 + + prompts.BUTTON_TITLE_CANCEL * prompts.BUTTON_POS_1; + + var bundle = document.getElementById("bundlePreferences"); + var title = bundle.getString("offlineAppRemoveTitle"); + var prompt = bundle.getFormattedString("offlineAppRemovePrompt", [principal.URI.prePath]); + var confirm = bundle.getString("offlineAppRemoveConfirm"); + var result = prompts.confirmEx(window, title, prompt, flags, confirm, + null, null, null, {}); + if (result != 0) + return; + + // get the permission + var pm = Components.classes["@mozilla.org/permissionmanager;1"] + .getService(Components.interfaces.nsIPermissionManager); + var perm = pm.getPermissionObject(principal, "offline-app", true); + if (perm) { + // clear offline cache entries + try { + var cacheService = Components.classes["@mozilla.org/network/application-cache-service;1"]. + getService(Components.interfaces.nsIApplicationCacheService); + var groups = cacheService.getGroups(); + for (var i = 0; i < groups.length; i++) { + var uri = Services.io.newURI(groups[i]); + if (perm.matchesURI(uri, true)) { + var cache = cacheService.getActiveCache(groups[i]); + cache.discard(); + } + } + } catch (e) {} + + pm.removePermission(perm); + } + list.removeChild(item); + gAdvancedPane.offlineAppSelected(); + this.updateActualAppCacheSize(); + }, + + // UPDATE TAB + + /* + * Preferences: + * + * app.update.enabled + * - true if updates to the application are enabled, false otherwise + * app.update.auto + * - true if updates should be automatically downloaded and installed and + * false if the user should be asked what he wants to do when an update is + * available + * extensions.update.enabled + * - true if updates to extensions and themes are enabled, false otherwise + * browser.search.update + * - true if updates to search engines are enabled, false otherwise + */ + + /** + * Selects the item of the radiogroup based on the pref values and locked + * states. + * + * UI state matrix for update preference conditions + * + * UI Components: Preferences + * Radiogroup i = app.update.enabled + * ii = app.update.auto + * + * Disabled states: + * Element pref value locked disabled + * radiogroup i t/f f false + * i t/f *t* *true* + * ii t/f f false + * ii t/f *t* *true* + */ + updateReadPrefs() { + if (AppConstants.MOZ_UPDATER) { + var enabledPref = document.getElementById("app.update.enabled"); + var autoPref = document.getElementById("app.update.auto"); + var radiogroup = document.getElementById("updateRadioGroup"); + + if (!enabledPref.value) // Don't care for autoPref.value in this case. + radiogroup.value = "manual"; // 3. Never check for updates. + else if (autoPref.value) // enabledPref.value && autoPref.value + radiogroup.value = "auto"; // 1. Automatically install updates + else // enabledPref.value && !autoPref.value + radiogroup.value = "checkOnly"; // 2. Check, but let me choose + + var canCheck = Components.classes["@mozilla.org/updates/update-service;1"]. + getService(Components.interfaces.nsIApplicationUpdateService). + canCheckForUpdates; + // canCheck is false if the enabledPref is false and locked, + // or the binary platform or OS version is not known. + // A locked pref is sufficient to disable the radiogroup. + radiogroup.disabled = !canCheck || enabledPref.locked || autoPref.locked; + + if (AppConstants.MOZ_MAINTENANCE_SERVICE) { + // Check to see if the maintenance service is installed. + // If it is don't show the preference at all. + var installed; + try { + var wrk = Components.classes["@mozilla.org/windows-registry-key;1"] + .createInstance(Components.interfaces.nsIWindowsRegKey); + wrk.open(wrk.ROOT_KEY_LOCAL_MACHINE, + "SOFTWARE\\Mozilla\\MaintenanceService", + wrk.ACCESS_READ | wrk.WOW64_64); + installed = wrk.readIntValue("Installed"); + wrk.close(); + } catch (e) { + } + if (installed != 1) { + document.getElementById("useService").hidden = true; + } + } + } + }, + + /** + * Sets the pref values based on the selected item of the radiogroup. + */ + updateWritePrefs() { + if (AppConstants.MOZ_UPDATER) { + var enabledPref = document.getElementById("app.update.enabled"); + var autoPref = document.getElementById("app.update.auto"); + var radiogroup = document.getElementById("updateRadioGroup"); + switch (radiogroup.value) { + case "auto": // 1. Automatically install updates for Desktop only + enabledPref.value = true; + autoPref.value = true; + break; + case "checkOnly": // 2. Check, but let me choose + enabledPref.value = true; + autoPref.value = false; + break; + case "manual": // 3. Never check for updates. + enabledPref.value = false; + autoPref.value = false; + } + } + }, + + /** + * Displays the history of installed updates. + */ + showUpdates() { + gSubDialog.open("chrome://mozapps/content/update/history.xul"); + }, + + // ENCRYPTION TAB + + /* + * Preferences: + * + * security.default_personal_cert + * - a string: + * "Select Automatically" select a certificate automatically when a site + * requests one + * "Ask Every Time" present a dialog to the user so he can select + * the certificate to use on a site which + * requests one + */ + + /** + * Displays the user's certificates and associated options. + */ + showCertificates() { + gSubDialog.open("chrome://pippki/content/certManager.xul"); + }, + + /** + * Displays a dialog from which the user can manage his security devices. + */ + showSecurityDevices() { + gSubDialog.open("chrome://pippki/content/device_manager.xul"); + }, + + observe(aSubject, aTopic, aData) { + if (AppConstants.MOZ_UPDATER) { + switch (aTopic) { + case "nsPref:changed": + this.updateReadPrefs(); + break; + + case "sitedatamanager:sites-updated": + this.updateTotalSiteDataSize(); + break; + } + } + }, +}; diff --git a/browser/components/preferences/in-content-old/advanced.xul b/browser/components/preferences/in-content-old/advanced.xul new file mode 100644 index 0000000000000..523211ec74f2e --- /dev/null +++ b/browser/components/preferences/in-content-old/advanced.xul @@ -0,0 +1,436 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + + + + + +

Site Data Test

+ + + diff --git a/browser/components/preferences/in-content-old/tests/subdialog.xul b/browser/components/preferences/in-content-old/tests/subdialog.xul new file mode 100644 index 0000000000000..48d297b7373b2 --- /dev/null +++ b/browser/components/preferences/in-content-old/tests/subdialog.xul @@ -0,0 +1,27 @@ + + + + + + + + + + A sample sub-dialog for testing + + + + + + diff --git a/browser/components/preferences/in-content-old/tests/subdialog2.xul b/browser/components/preferences/in-content-old/tests/subdialog2.xul new file mode 100644 index 0000000000000..89803c2503baf --- /dev/null +++ b/browser/components/preferences/in-content-old/tests/subdialog2.xul @@ -0,0 +1,27 @@ + + + + + + + + + + A sample sub-dialog for testing + + + + + + diff --git a/browser/components/preferences/moz.build b/browser/components/preferences/moz.build index 49efefa37306f..ae79e6bf4e58b 100644 --- a/browser/components/preferences/moz.build +++ b/browser/components/preferences/moz.build @@ -4,10 +4,14 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -DIRS += ['in-content'] +DIRS += [ + 'in-content-old', + 'in-content' +] BROWSER_CHROME_MANIFESTS += [ - 'in-content/tests/browser.ini', + 'in-content-old/tests/browser.ini', + 'in-content/tests/browser.ini' ] for var in ('MOZ_APP_NAME', 'MOZ_MACBUNDLE_NAME'): diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn index 85853adef06ea..fabe1632301f6 100644 --- a/browser/installer/allowed-dupes.mn +++ b/browser/installer/allowed-dupes.mn @@ -10,6 +10,79 @@ LaunchServices/org.mozilla.updater updater.app/Contents/MacOS/org.mozilla.updater updater.app/Contents/PkgInfo browser/chrome.manifest +# browser preferences fork is bug 1349689 +browser/chrome/browser/content/browser/preferences/in-content-old/advanced.js +browser/chrome/browser/content/browser/preferences/in-content-old/applications.js +browser/chrome/browser/content/browser/preferences/in-content-old/containers.js +browser/chrome/browser/content/browser/preferences/in-content-old/content.js +browser/chrome/browser/content/browser/preferences/in-content-old/main.js +browser/chrome/browser/content/browser/preferences/in-content-old/preferences.js +browser/chrome/browser/content/browser/preferences/in-content-old/privacy.js +browser/chrome/browser/content/browser/preferences/in-content-old/search.js +browser/chrome/browser/content/browser/preferences/in-content-old/security.js +browser/chrome/browser/content/browser/preferences/in-content-old/sync.js +browser/chrome/browser/content/browser/preferences/in-content/advanced.js +browser/chrome/browser/content/browser/preferences/in-content/applications.js +browser/chrome/browser/content/browser/preferences/in-content/containers.js +browser/chrome/browser/content/browser/preferences/in-content/content.js +browser/chrome/browser/content/browser/preferences/in-content/main.js +browser/chrome/browser/content/browser/preferences/in-content/preferences.js +browser/chrome/browser/content/browser/preferences/in-content/privacy.js +browser/chrome/browser/content/browser/preferences/in-content/search.js +browser/chrome/browser/content/browser/preferences/in-content/security.js +browser/chrome/browser/content/browser/preferences/in-content/sync.js +browser/chrome/en-US/locale/browser/preferences-old/applicationManager.dtd +browser/chrome/en-US/locale/browser/preferences-old/selectBookmark.dtd +browser/chrome/en-US/locale/browser/preferences-old/applications.dtd +browser/chrome/en-US/locale/browser/preferences-old/blocklists.dtd +browser/chrome/en-US/locale/browser/preferences-old/applicationManager.properties +browser/chrome/en-US/locale/browser/preferences-old/donottrack.dtd +browser/chrome/en-US/locale/browser/preferences-old/languages.dtd +browser/chrome/en-US/locale/browser/preferences-old/translation.dtd +browser/chrome/en-US/locale/browser/preferences-old/permissions.dtd +browser/chrome/en-US/locale/browser/preferences-old/containers.properties +browser/chrome/en-US/locale/browser/preferences-old/cookies.dtd +browser/chrome/en-US/locale/browser/preferences-old/containers.dtd +browser/chrome/en-US/locale/browser/preferences-old/tabs.dtd +browser/chrome/en-US/locale/browser/preferences-old/colors.dtd +browser/chrome/en-US/locale/browser/preferences-old/siteDataSettings.dtd +browser/chrome/en-US/locale/browser/preferences-old/preferences.dtd +browser/chrome/en-US/locale/browser/preferences-old/search.dtd +browser/chrome/en-US/locale/browser/preferences-old/security.dtd +browser/chrome/en-US/locale/browser/preferences-old/main.dtd +browser/chrome/en-US/locale/browser/preferences-old/connection.dtd +browser/chrome/en-US/locale/browser/preferences-old/content.dtd +browser/chrome/en-US/locale/browser/preferences-old/sync.dtd +browser/chrome/en-US/locale/browser/preferences-old/fonts.dtd +browser/chrome/en-US/locale/browser/preferences-old/privacy.dtd +browser/chrome/en-US/locale/browser/preferences-old/advanced.dtd +browser/chrome/en-US/locale/browser/preferences-old/preferences.properties +browser/chrome/en-US/locale/browser/preferences/applicationManager.dtd +browser/chrome/en-US/locale/browser/preferences/selectBookmark.dtd +browser/chrome/en-US/locale/browser/preferences/applications.dtd +browser/chrome/en-US/locale/browser/preferences/blocklists.dtd +browser/chrome/en-US/locale/browser/preferences/applicationManager.properties +browser/chrome/en-US/locale/browser/preferences/donottrack.dtd +browser/chrome/en-US/locale/browser/preferences/languages.dtd +browser/chrome/en-US/locale/browser/preferences/translation.dtd +browser/chrome/en-US/locale/browser/preferences/permissions.dtd +browser/chrome/en-US/locale/browser/preferences/containers.properties +browser/chrome/en-US/locale/browser/preferences/cookies.dtd +browser/chrome/en-US/locale/browser/preferences/containers.dtd +browser/chrome/en-US/locale/browser/preferences/tabs.dtd +browser/chrome/en-US/locale/browser/preferences/colors.dtd +browser/chrome/en-US/locale/browser/preferences/siteDataSettings.dtd +browser/chrome/en-US/locale/browser/preferences/preferences.dtd +browser/chrome/en-US/locale/browser/preferences/search.dtd +browser/chrome/en-US/locale/browser/preferences/security.dtd +browser/chrome/en-US/locale/browser/preferences/main.dtd +browser/chrome/en-US/locale/browser/preferences/connection.dtd +browser/chrome/en-US/locale/browser/preferences/content.dtd +browser/chrome/en-US/locale/browser/preferences/sync.dtd +browser/chrome/en-US/locale/browser/preferences/fonts.dtd +browser/chrome/en-US/locale/browser/preferences/privacy.dtd +browser/chrome/en-US/locale/browser/preferences/advanced.dtd +browser/chrome/en-US/locale/browser/preferences/preferences.properties # browser branding / themes is bug 1313106 browser/chrome/browser/content/branding/icon128.png browser/chrome/browser/content/branding/icon16.png diff --git a/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd b/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd new file mode 100644 index 0000000000000..4bf2723c434a2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/advanced.dtd @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd new file mode 100644 index 0000000000000..d2c76e63d7717 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.dtd @@ -0,0 +1,8 @@ + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties new file mode 100644 index 0000000000000..335363a662cfe --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/applicationManager.properties @@ -0,0 +1,14 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# LOCALIZATION NOTE +# in descriptionApplications, %S will be replaced by one of the 3 following strings +descriptionApplications=The following applications can be used to handle %S. + +handleProtocol=%S links +handleWebFeeds=Web Feeds +handleFile=%S content + +descriptionWebApp=This web application is hosted at: +descriptionLocalApp=This application is located at: diff --git a/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd b/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd new file mode 100644 index 0000000000000..ea89c3124466c --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/applications.dtd @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd b/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd new file mode 100644 index 0000000000000..31a2986fe4570 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/blocklists.dtd @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd b/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd new file mode 100644 index 0000000000000..153f68d7c90cd --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/colors.dtd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd b/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd new file mode 100644 index 0000000000000..850964a0fa7c2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/connection.dtd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd b/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd new file mode 100644 index 0000000000000..d715813548c5a --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/containers.dtd @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/containers.properties b/browser/locales/en-US/chrome/browser/preferences-old/containers.properties new file mode 100644 index 0000000000000..6b78a9263fca2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/containers.properties @@ -0,0 +1,24 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +containers.labelMinWidth = 4rem +containers.updateContainerTitle = %S Container Preferences + +containers.blue.label = Blue +containers.turquoise.label = Turquoise +containers.green.label = Green +containers.yellow.label = Yellow +containers.orange.label = Orange +containers.red.label = Red +containers.pink.label = Pink +containers.purple.label = Purple + +containers.fingerprint.label = Fingerprint +containers.briefcase.label = Briefcase +# LOCALIZATION NOTE (containers.dollar.label) +# String represents a money sign but currently uses a dollar sign so don't change to local currency +# See Bug 1291672 +containers.dollar.label = Dollar sign +containers.cart.label = Shopping cart +containers.circle.label = Dot diff --git a/browser/locales/en-US/chrome/browser/preferences-old/content.dtd b/browser/locales/en-US/chrome/browser/preferences-old/content.dtd new file mode 100644 index 0000000000000..c0d1c9f311dce --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/content.dtd @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd b/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd new file mode 100644 index 0000000000000..e4d3a9b9ca70c --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/cookies.dtd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd b/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd new file mode 100644 index 0000000000000..781fb53cd5b78 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/donottrack.dtd @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd b/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd new file mode 100644 index 0000000000000..cdf5c2ba786db --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/fonts.dtd @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd b/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd new file mode 100644 index 0000000000000..ba5b11eb5fc19 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/languages.dtd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/main.dtd b/browser/locales/en-US/chrome/browser/preferences-old/main.dtd new file mode 100644 index 0000000000000..3085ffd0deadb --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/main.dtd @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd b/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd new file mode 100644 index 0000000000000..e61228b76d156 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/permissions.dtd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd b/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd new file mode 100644 index 0000000000000..380da71783630 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/preferences.dtd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties b/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties new file mode 100644 index 0000000000000..2f2e1ab34929f --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/preferences.properties @@ -0,0 +1,253 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#### Security + +# LOCALIZATION NOTE: phishBefore uses %S to represent the name of the provider +# whose privacy policy must be accepted (for enabling +# check-every-page-as-I-load-it phishing protection). +phishBeforeText=Selecting this option will send the address of web pages you are viewing to %S. To continue, please review and accept the following terms of service. + +#### Fonts + +labelDefaultFont=Default (%S) + +veryLargeMinimumFontTitle=Large minimum font size +veryLargeMinimumFontWarning=You have selected a very large minimum font size (more than 24 pixels). This may make it difficult or impossible to use some important configuration pages like this one. +acceptVeryLargeMinimumFont=Keep my changes anyway + +#### Permissions Manager + +trackingprotectionpermissionstext=You have disabled Tracking Protection on these sites. +trackingprotectionpermissionstitle=Exceptions - Tracking Protection +cookiepermissionstext=You can specify which websites are always or never allowed to use cookies. Type the exact address of the site you want to manage and then click Block, Allow for Session, or Allow. +cookiepermissionstitle=Exceptions - Cookies +addonspermissionstext=You can specify which websites are allowed to install add-ons. Type the exact address of the site you want to allow and then click Allow. +addons_permissions_title=Allowed Sites - Add-ons Installation +popuppermissionstext=You can specify which websites are allowed to open pop-up windows. Type the exact address of the site you want to allow and then click Allow. +popuppermissionstitle=Allowed Sites - Pop-ups +notificationspermissionstext4=Control which websites are always or never allowed to send you notifications. If you remove a site, it will need to request permission again. +notificationspermissionstitle=Notification Permissions +invalidURI=Please enter a valid hostname +invalidURITitle=Invalid Hostname Entered +savedLoginsExceptions_title=Exceptions - Saved Logins +savedLoginsExceptions_desc=Logins for the following sites will not be saved: + +#### Block List Manager + +blockliststext=You can choose which list Firefox will use to block Web elements that may track your browsing activity. +blockliststitle=Block Lists +# LOCALIZATION NOTE (mozNameTemplate): This template constructs the name of the +# block list in the block lists dialog. It combines the list name and +# description. +# e.g. mozNameTemplate : "Standard (Recommended). This list does a pretty good job." +# %1$S = list name (fooName), %2$S = list descriptive text (fooDesc) +mozNameTemplate=%1$S %2$S +# LOCALIZATION NOTE (mozstdName, etc.): These labels appear in the tracking +# protection block lists dialog, mozNameTemplate is used to create the final +# string. Note that in the future these two strings (name, desc) could be +# displayed on two different lines. +mozstdName=Disconnect.me basic protection (Recommended). +mozstdDesc=Allows some trackers so websites function properly. +mozfullName=Disconnect.me strict protection. +mozfullDesc=Blocks known trackers. Some sites may not function properly. +# LOCALIZATION NOTE (blocklistChangeRequiresRestart): %S = brandShortName +blocklistChangeRequiresRestart=%S must restart to change block lists. + +#### Master Password + +pw_change2empty_in_fips_mode=You are currently in FIPS mode. FIPS requires a non-empty Master Password. +pw_change_failed_title=Password Change Failed + +#### Fonts + +# LOCALIZATION NOTE: Next two strings are for language name representations with +# and without the region. +# e.g. languageRegionCodeFormat : "French/Canada [fr-ca]" languageCodeFormat : "French [fr]" +# %1$S = language name, %2$S = region name, %3$S = language-region code +languageRegionCodeFormat=%1$S/%2$S [%3$S] +# %1$S = language name, %2$S = language-region code +languageCodeFormat=%1$S [%2$S] + +#### Downloads + +desktopFolderName=Desktop +downloadsFolderName=Downloads +chooseDownloadFolderTitle=Choose Download Folder: + +#### Applications + +fileEnding=%S file +saveFile=Save File + +# LOCALIZATION NOTE (useApp, useDefault): %S = Application name +useApp=Use %S +useDefault=Use %S (default) + +useOtherApp=Use other… +fpTitleChooseApp=Select Helper Application +manageApp=Application Details… +webFeed=Web Feed +videoPodcastFeed=Video Podcast +audioPodcastFeed=Podcast +alwaysAsk=Always ask +portableDocumentFormat=Portable Document Format (PDF) + +# LOCALIZATION NOTE (usePluginIn): +# %1$S = plugin name (for example "QuickTime Plugin-in 7.2") +# %2$S = brandShortName from brand.properties (for example "Minefield") +usePluginIn=Use %S (in %S) + +# LOCALIZATION NOTE (previewInApp, addLiveBookmarksInApp): %S = brandShortName +previewInApp=Preview in %S +addLiveBookmarksInApp=Add Live Bookmarks in %S + +# LOCALIZATION NOTE (typeDescriptionWithType): +# %1$S = type description (for example "Portable Document Format") +# %2$S = type (for example "application/pdf") +typeDescriptionWithType=%S (%S) + + +#### Cookie Viewer + +hostColon=Host: +domainColon=Domain: +forSecureOnly=Encrypted connections only +forAnyConnection=Any type of connection +expireAtEndOfSession=At end of session +can=Allow +canAccessFirstParty=Allow first party only +canSession=Allow for Session +cannot=Block +noCookieSelected= +cookiesAll=The following cookies are stored on your computer: +cookiesFiltered=The following cookies match your search: + +# LOCALIZATION NOTE (removeAllCookies, removeAllShownCookies): +# removeAllCookies and removeAllShownCookies are both used on the same one button, +# never displayed together and can share the same accesskey. +# When only partial cookies are shown as a result of keyword search, +# removeAllShownCookies is displayed as button label. +# removeAllCookies is displayed when no keyword search and all cookies are shown. +removeAllCookies.label=Remove All +removeAllCookies.accesskey=A +removeAllShownCookies.label=Remove All Shown +removeAllShownCookies.accesskey=A + +# LOCALIZATION NOTE (removeSelectedCookies): +# Semicolon-separated list of plural forms. See: +# http://developer.mozilla.org/en/docs/Localization_and_Plurals +# If you need to display the number of selected elements in your language, +# you can use #1 in your localization as a placeholder for the number. +# For example this is the English string with numbers: +# removeSelectedCookied=Remove #1 Selected;Remove #1 Selected +removeSelectedCookies.label=Remove Selected;Remove Selected +removeSelectedCookies.accesskey=R + +defaultUserContextLabel=None + +#### Offline apps +offlineAppsList.height=7em +offlineAppRemoveTitle=Remove offline website data +offlineAppRemovePrompt=After removing this data, %S will not be available offline. Are you sure you want to remove this offline website? +offlineAppRemoveConfirm=Remove offline data + +# LOCALIZATION NOTE: The next string is for the disk usage of the +# offline application +# e.g. offlineAppUsage : "50.23 MB" +# %1$S = size (in bytes or megabytes, ...) +# %2$S = unit of measure (bytes, KB, MB, ...) +offlineAppUsage=%1$S %2$S + +offlinepermissionstext=The following websites are not allowed to store data for offline use: +offlinepermissionstitle=Offline Data + +####Preferences::Advanced::Network +#LOCALIZATION NOTE: The next string is for the disk usage of the web content cache. +# e.g., "Your web content cache is currently using 200 MB" +# %1$S = size +# %2$S = unit (MB, KB, etc.) +actualDiskCacheSize=Your web content cache is currently using %1$S %2$S of disk space +actualDiskCacheSizeCalculated=Calculating web content cache size… + +####Preferences::Advanced::Network +#LOCALIZATION NOTE: The next string is for the disk usage of the application cache. +# e.g., "Your application cache is currently using 200 MB" +# %1$S = size +# %2$S = unit (MB, KB, etc.) +actualAppCacheSize=Your application cache is currently using %1$S %2$S of disk space + +####Preferences::Advanced::Network +#LOCALIZATION NOTE: The next string is for the total usage of site data. +# e.g., "The total usage is currently using 200 MB" +# %1$S = size +# %2$S = unit (MB, KB, etc.) +totalSiteDataSize=Your stored site data is currently using %1$S %2$S of disk space +clearSiteDataPromptTitle=Clear all cookies and site data +clearSiteDataPromptText=Selecting ‘Clear Now’ will clear all cookies and site data stored by Firefox. This may sign you out of websites and remove offline web content. +clearSiteDataNow=Clear Now +important=Important +default=Default +siteUsage=%1$S %2$S +# LOCALIZATION NOTE (removeAllSiteData, removeAllSiteDataShown): +# removeAllSiteData and removeAllSiteDataShown are both used on the same one button, +# never displayed together and can share the same accesskey. +# When only partial sites are shown as a result of keyword search, +# removeAllShown is displayed as button label. +# removeAll is displayed when no keyword search and all sites are shown. +removeAllSiteData.label=Remove All +removeAllSiteData.accesskey=e +removeAllSiteDataShown.label=Remove All Shown +removeAllSiteDataShown.accesskey=e +spaceAlert.learnMoreButton.label=Learn More +spaceAlert.learnMoreButton.accesskey=L +spaceAlert.over5GB.prefButton.label=Open Preferences +spaceAlert.over5GB.prefButton.accesskey=O +# LOCALIZATION NOTE (spaceAlert.over5GB.prefButtonWin.label): On Windows Preferences is called Options +spaceAlert.over5GB.prefButtonWin.label=Open Options +spaceAlert.over5GB.prefButtonWin.accesskey=O +# LOCALIZATION NOTE (spaceAlert.over5GB.message): %S = brandShortName +spaceAlert.over5GB.message=%S is running out of disk space. Website contents may not display properly. You can clear stored site data in Preferences > Advanced > Site Data. +# LOCALIZATION NOTE (spaceAlert.over5GB.messageWin): +# - On Windows Preferences is called Options +# - %S = brandShortName +spaceAlert.over5GB.messageWin=%S is running out of disk space. Website contents may not display properly. You can clear stored site data in Options > Advanced > Site Data. +spaceAlert.under5GB.okButton.label=OK, Got it +spaceAlert.under5GB.okButton.accesskey=K +# LOCALIZATION NOTE (spaceAlert.under5GB.message): %S = brandShortName +spaceAlert.under5GB.message=%S is running out of disk space. Website contents may not display properly. Visit “Learn More” to optimize your disk usage for better browsing experience. + +# LOCALIZATION NOTE (featureEnableRequiresRestart, featureDisableRequiresRestart, restartTitle): %S = brandShortName +featureEnableRequiresRestart=%S must restart to enable this feature. +featureDisableRequiresRestart=%S must restart to disable this feature. +shouldRestartTitle=Restart %S +okToRestartButton=Restart %S now +revertNoRestartButton=Revert + +restartNow=Restart Now +restartLater=Restart Later + +disableContainersAlertTitle=Close All Container Tabs? + +# LOCALIZATION NOTE (disableContainersMsg): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #S is the number of container tabs +disableContainersMsg=If you disable Container Tabs now, #S container tab will be closed. Are you sure you want to disable Container Tabs?;If you disable Container Tabs now, #S container tabs will be closed. Are you sure you want to disable Container Tabs? + +# LOCALIZATION NOTE (disableContainersOkButton): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #S is the number of container tabs +disableContainersOkButton=Close #S Container Tab;Close #S Container Tabs + +disableContainersButton2=Keep enabled + +removeContainerAlertTitle=Remove This Container? + +# LOCALIZATION NOTE (removeContainerMsg): Semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# #S is the number of container tabs +removeContainerMsg=If you remove this Container now, #S container tab will be closed. Are you sure you want to remove this Container?;If you remove this Container now, #S container tabs will be closed. Are you sure you want to remove this Container? + +removeContainerOkButton=Remove this Container +removeContainerButton2=Don’t remove this Container diff --git a/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd b/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd new file mode 100644 index 0000000000000..4c38c111afcbc --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/privacy.dtd @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/search.dtd b/browser/locales/en-US/chrome/browser/preferences-old/search.dtd new file mode 100644 index 0000000000000..470933342aadc --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/search.dtd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/security.dtd b/browser/locales/en-US/chrome/browser/preferences-old/security.dtd new file mode 100644 index 0000000000000..cc067e40390d3 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/security.dtd @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd b/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd new file mode 100644 index 0000000000000..a6082862addc2 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/selectBookmark.dtd @@ -0,0 +1,9 @@ + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd b/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd new file mode 100644 index 0000000000000..51f523a06ed50 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/siteDataSettings.dtd @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd b/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd new file mode 100644 index 0000000000000..277d013ed5204 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/sync.dtd @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd b/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd new file mode 100644 index 0000000000000..5b3dcd621c77f --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/tabs.dtd @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd b/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd new file mode 100644 index 0000000000000..fc5fb2b7b6e62 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/preferences-old/translation.dtd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn index b1edf111714f8..02d0040e29fb9 100644 --- a/browser/locales/jar.mn +++ b/browser/locales/jar.mn @@ -50,7 +50,6 @@ locale/browser/places/places.properties (%chrome/browser/places/places.properties) locale/browser/places/editBookmarkOverlay.dtd (%chrome/browser/places/editBookmarkOverlay.dtd) locale/browser/places/bookmarkProperties.properties (%chrome/browser/places/bookmarkProperties.properties) - locale/browser/preferences/selectBookmark.dtd (%chrome/browser/preferences/selectBookmark.dtd) locale/browser/places/moveBookmarks.dtd (%chrome/browser/places/moveBookmarks.dtd) locale/browser/safebrowsing/phishing-afterload-warning-message.dtd (%chrome/browser/safebrowsing/phishing-afterload-warning-message.dtd) locale/browser/safebrowsing/report-phishing.dtd (%chrome/browser/safebrowsing/report-phishing.dtd) @@ -59,30 +58,57 @@ locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties) locale/browser/migration/migration.dtd (%chrome/browser/migration/migration.dtd) locale/browser/migration/migration.properties (%chrome/browser/migration/migration.properties) + locale/browser/preferences-old/advanced.dtd (%chrome/browser/preferences-old/advanced.dtd) locale/browser/preferences/advanced.dtd (%chrome/browser/preferences/advanced.dtd) - locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd) - locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) + locale/browser/preferences-old/applicationManager.dtd (%chrome/browser/preferences-old/applicationManager.dtd) + locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd) + locale/browser/preferences-old/applicationManager.properties (%chrome/browser/preferences-old/applicationManager.properties) + locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties) + locale/browser/preferences-old/applications.dtd (%chrome/browser/preferences-old/applications.dtd) + locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) + locale/browser/preferences-old/blocklists.dtd (%chrome/browser/preferences-old/blocklists.dtd) locale/browser/preferences/blocklists.dtd (%chrome/browser/preferences/blocklists.dtd) + locale/browser/preferences-old/colors.dtd (%chrome/browser/preferences-old/colors.dtd) locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd) - locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd) - locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) + locale/browser/preferences-old/connection.dtd (%chrome/browser/preferences-old/connection.dtd) locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd) + locale/browser/preferences-old/containers.dtd (%chrome/browser/preferences-old/containers.dtd) + locale/browser/preferences/containers.dtd (%chrome/browser/preferences/containers.dtd) + locale/browser/preferences-old/containers.properties (%chrome/browser/preferences-old/containers.properties) + locale/browser/preferences/containers.properties (%chrome/browser/preferences/containers.properties) + locale/browser/preferences-old/content.dtd (%chrome/browser/preferences-old/content.dtd) + locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd) + locale/browser/preferences-old/cookies.dtd (%chrome/browser/preferences-old/cookies.dtd) + locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd) + locale/browser/preferences-old/donottrack.dtd (%chrome/browser/preferences-old/donottrack.dtd) locale/browser/preferences/donottrack.dtd (%chrome/browser/preferences/donottrack.dtd) - locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd) + locale/browser/preferences-old/fonts.dtd (%chrome/browser/preferences-old/fonts.dtd) locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd) - locale/browser/preferences/main.dtd (%chrome/browser/preferences/main.dtd) + locale/browser/preferences-old/languages.dtd (%chrome/browser/preferences-old/languages.dtd) locale/browser/preferences/languages.dtd (%chrome/browser/preferences/languages.dtd) + locale/browser/preferences-old/main.dtd (%chrome/browser/preferences-old/main.dtd) + locale/browser/preferences/main.dtd (%chrome/browser/preferences/main.dtd) + locale/browser/preferences-old/permissions.dtd (%chrome/browser/preferences-old/permissions.dtd) locale/browser/preferences/permissions.dtd (%chrome/browser/preferences/permissions.dtd) + locale/browser/preferences-old/preferences.dtd (%chrome/browser/preferences-old/preferences.dtd) locale/browser/preferences/preferences.dtd (%chrome/browser/preferences/preferences.dtd) - locale/browser/preferences/preferences.properties (%chrome/browser/preferences/preferences.properties) - locale/browser/preferences/containers.properties (%chrome/browser/preferences/containers.properties) + locale/browser/preferences-old/preferences.properties (%chrome/browser/preferences-old/preferences.properties) + locale/browser/preferences/preferences.properties (%chrome/browser/preferences/preferences.properties) + locale/browser/preferences-old/privacy.dtd (%chrome/browser/preferences-old/privacy.dtd) locale/browser/preferences/privacy.dtd (%chrome/browser/preferences/privacy.dtd) + locale/browser/preferences-old/search.dtd (%chrome/browser/preferences-old/search.dtd) + locale/browser/preferences/search.dtd (%chrome/browser/preferences/search.dtd) + locale/browser/preferences-old/security.dtd (%chrome/browser/preferences-old/security.dtd) locale/browser/preferences/security.dtd (%chrome/browser/preferences/security.dtd) - locale/browser/preferences/containers.dtd (%chrome/browser/preferences/containers.dtd) + locale/browser/preferences-old/selectBookmark.dtd (%chrome/browser/preferences-old/selectBookmark.dtd) + locale/browser/preferences/selectBookmark.dtd (%chrome/browser/preferences/selectBookmark.dtd) + locale/browser/preferences-old/siteDataSettings.dtd (%chrome/browser/preferences-old/siteDataSettings.dtd) + locale/browser/preferences/siteDataSettings.dtd (%chrome/browser/preferences/siteDataSettings.dtd) + locale/browser/preferences-old/sync.dtd (%chrome/browser/preferences-old/sync.dtd) locale/browser/preferences/sync.dtd (%chrome/browser/preferences/sync.dtd) + locale/browser/preferences-old/tabs.dtd (%chrome/browser/preferences-old/tabs.dtd) locale/browser/preferences/tabs.dtd (%chrome/browser/preferences/tabs.dtd) - locale/browser/preferences/search.dtd (%chrome/browser/preferences/search.dtd) - locale/browser/preferences/siteDataSettings.dtd (%chrome/browser/preferences/siteDataSettings.dtd) + locale/browser/preferences-old/translation.dtd (%chrome/browser/preferences-old/translation.dtd) locale/browser/preferences/translation.dtd (%chrome/browser/preferences/translation.dtd) locale/browser/syncBrand.dtd (%chrome/browser/syncBrand.dtd) locale/browser/syncSetup.properties (%chrome/browser/syncSetup.properties) From 96419dac1207de4b5293cf7f73b9262b30279144 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 18 Mar 2017 20:34:57 +0100 Subject: [PATCH 014/300] Bug 1348086 - Part 0 - Fix javadoc error. r=gbrown MozReview-Commit-ID: DY06yz6tEj4 --- .../org/mozilla/gecko/tests/components/ToolbarComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java index 25101a3953827..ed1d1a074ff32 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java @@ -164,7 +164,7 @@ private String getUrlFromContentDescription() { /** * Returns the title of the page. Note that this makes no assertions to Toolbar state and * may return a value that may never be visible to the user. Callers likely want to use - * {@link assertTitle} instead. + * {@link #assertTitle} instead. */ public String getPotentiallyInconsistentTitle() { return getTitleHelper(false); From 1087276a42d525aff078f1ad6b6d719f7f860280 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Thu, 16 Mar 2017 21:33:44 +0100 Subject: [PATCH 015/300] Bug 1348086 - Part 1 - Use distinct R.id for the tabs tray menu button. r=gbrown Robocop/Robotium gets terribly confused if multiple views use the same R.id, even if they're never shown together at the same time. Without this patch, opening of the main menu fails once the tabs tray has been opened (and closed again) at least once. MozReview-Commit-ID: IOyxG4SCyzF --- mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java | 2 +- mobile/android/base/resources/layout/tabs_panel_default.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java index b599fb2306635..776834a998e4d 100644 --- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java +++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java @@ -169,7 +169,7 @@ public void onClick(View v) { mTabWidget.setTabSelectionListener(this); - mMenuButton = findViewById(R.id.menu); + mMenuButton = findViewById(R.id.tabs_menu); mMenuButton.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View view) { diff --git a/mobile/android/base/resources/layout/tabs_panel_default.xml b/mobile/android/base/resources/layout/tabs_panel_default.xml index ea15bc7f64e63..0e7d506d5f693 100644 --- a/mobile/android/base/resources/layout/tabs_panel_default.xml +++ b/mobile/android/base/resources/layout/tabs_panel_default.xml @@ -49,7 +49,7 @@ android:contentDescription="@string/new_tab" android:background="@drawable/action_bar_button_inverse"/> - Date: Sat, 18 Mar 2017 20:11:24 +0100 Subject: [PATCH 016/300] Bug 1348086 - Part 2 - Check whether an URL is already absolute before processing it. r=gbrown Necessary if we already have an absolute URL and want to pass that to ToolbarComponent.assertTitle(). MozReview-Commit-ID: adXLYGyAZ1 --- .../browser/robocop/src/org/mozilla/gecko/tests/UITest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java index 43bb3cbdf8b3b..77f13dbe8b59f 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java @@ -142,7 +142,11 @@ public String getAbsoluteIpUrl(final String url) { } private String getAbsoluteUrl(final String baseUrl, final String url) { - return baseUrl + "/" + url.replaceAll("(^/)", ""); + if (!url.startsWith(baseUrl)) { + return baseUrl + "/" + url.replaceAll("(^/)", ""); + } + + return url; } /** From e2aa4969b1ba0a054978e7bd78368543ba749936 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 18 Mar 2017 20:19:01 +0100 Subject: [PATCH 017/300] Bug 1348086 - Part 3 - Port selectTabAt() to TabsPanelComponent. r=gbrown MozReview-Commit-ID: LlrgFq49Kyz --- .../src/org/mozilla/gecko/tests/UITest.java | 6 ++ .../mozilla/gecko/tests/UITestContext.java | 2 + .../tests/components/TabsPanelComponent.java | 61 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java index 77f13dbe8b59f..cfa8088cb65c6 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITest.java @@ -7,6 +7,7 @@ import org.mozilla.gecko.Actions; import org.mozilla.gecko.Assert; import org.mozilla.gecko.Driver; +import org.mozilla.gecko.RobocopUtils; import org.mozilla.gecko.tests.components.AboutHomeComponent; import org.mozilla.gecko.tests.components.AppMenuComponent; import org.mozilla.gecko.tests.components.BaseComponent; @@ -149,6 +150,11 @@ private String getAbsoluteUrl(final String baseUrl, final String url) { return url; } + @Override + public final void runOnUiThreadSync(Runnable runnable) { + RobocopUtils.runOnUiThreadSync(getActivity(), runnable); + } + /** * Throws an Exception. Called from overridden JUnit methods to ensure JUnit assertions * are not accidentally used over AssertionHelper assertions (the latter of which contains diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITestContext.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITestContext.java index c825a20a4cf41..e9095413468c3 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITestContext.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/UITestContext.java @@ -47,5 +47,7 @@ public static enum ComponentType { */ public String getAbsoluteIpUrl(final String url); + public void runOnUiThreadSync(Runnable runnable); + public BaseComponent getComponent(final ComponentType type); } diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/TabsPanelComponent.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/TabsPanelComponent.java index 2881a0a61169a..f2bc00c3e9377 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/TabsPanelComponent.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/TabsPanelComponent.java @@ -15,6 +15,8 @@ import static org.mozilla.gecko.tests.helpers.AssertionHelper.fAssertTrue; public class TabsPanelComponent extends TabsPresenterComponent { + private static final int MAX_WAIT_MS = 4500; + public TabsPanelComponent(final UITestContext testContext) { super(testContext); } @@ -91,4 +93,63 @@ private void assertTabsPanelIsClosed() { final View tabsPanel = getTabsPanel(); fAssertTrue("Tabs panel is closed", tabsPanel == null || tabsPanel.getVisibility() != View.VISIBLE); } + + /** + * Scrolls the tabs panel and then selects the tab at the specified index. + * + * @param index Index of tab to select + */ + public void selectTabAt(final int index) { + mSolo.clickOnView(scrollAndGetTabViewAt(index)); + } + + /** + * Gets the view in the tabs panel at the specified index. + * + * @return View at index + */ + private View scrollAndGetTabViewAt(final int index) { + final View[] childView = { null }; + + final RecyclerView view = getTabsLayout(); + + mTestContext.runOnUiThreadSync(new Runnable() { + @Override + public void run() { + view.scrollToPosition(index); + + // The selection isn't updated synchronously; posting a + // runnable to the view's queue guarantees we'll run after the + // layout pass. + view.post(new Runnable() { + @Override + public void run() { + // Index is relative to all views in the list. + final RecyclerView.ViewHolder itemViewHolder = + view.findViewHolderForLayoutPosition(index); + childView[0] = itemViewHolder == null ? null : itemViewHolder.itemView; + } + }); + } + }); + + WaitHelper.waitFor("list item at index " + index + " exists", new Condition() { + @Override + public boolean isSatisfied() { + return childView[0] != null; + } + }, MAX_WAIT_MS); + + return childView[0]; + } + + /** + * Gets the RecyclerView of the tabs list. + * + * @return List view in the tabs panel + */ + private RecyclerView getTabsLayout() { + openPanel(); + return (RecyclerView) mSolo.getView(R.id.normal_tabs); + } } From 0b877ed40b79f5ad34c6ea739a45cdb4a6c72e41 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Sat, 18 Mar 2017 20:35:50 +0100 Subject: [PATCH 018/300] Bug 1348086 - Part 4 - Port verifyTabCount() to ToolbarComponent. r=gbrown MozReview-Commit-ID: JDHwH4D0coH --- .../tests/components/ToolbarComponent.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java index ed1d1a074ff32..7abed6c5a1ca7 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java @@ -19,6 +19,7 @@ import android.view.View; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.TextSwitcher; import android.widget.TextView; import com.robotium.solo.Condition; @@ -90,6 +91,12 @@ public ToolbarComponent assertBackButtonIsNotEnabled() { return this; } + public ToolbarComponent assertTabCount(final int expectedTabCount) { + assertIsNotEditing(); + fAssertEquals("The correct number of tabs are opened", expectedTabCount, getTabsCount()); + return this; + } + /** * Returns the root View for the browser toolbar. */ @@ -110,6 +117,16 @@ private TextView getUrlTitleText() { return (TextView) getToolbarView().findViewById(R.id.url_bar_title); } + private TextSwitcher getTabsCounter() { + return (TextSwitcher) getToolbarView().findViewById(R.id.tabs_counter); + } + + private int getTabsCount() { + TextView currentView = (TextView) getTabsCounter().getCurrentView(); + String tabsCountText = currentView.getText().toString(); + return Integer.parseInt(tabsCountText); + } + private ImageButton getBackButton() { DeviceHelper.assertIsTablet(); return (ImageButton) getToolbarView().findViewById(R.id.back); From 0b5b1fa8bcf9f02162717aef2964f486f25de1e5 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Fri, 17 Mar 2017 22:25:57 +0100 Subject: [PATCH 019/300] Bug 1348086 - Part 5 - Convert session store robocop tests to be based on UITest. r=gbrown UITest is our more modern framework for Robocop tests, so using that will hopefully make these tests more reliable and cut down on the intermittent failures which led to them being deactivated. MozReview-Commit-ID: 6iZCS75FUvT --- .../org/mozilla/gecko/tests/SessionTest.java | 63 +++++++------------ .../tests/components/ToolbarComponent.java | 3 +- .../gecko/tests/testSessionOOMRestore.java | 4 +- .../gecko/tests/testSessionOOMSave.java | 6 +- 4 files changed, 29 insertions(+), 47 deletions(-) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java index 61f2c8553c2f0..2d5c5b7e537ac 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/SessionTest.java @@ -4,6 +4,8 @@ package org.mozilla.gecko.tests; +import android.util.Log; + import java.io.File; import java.io.FileReader; import java.io.FileWriter; @@ -12,20 +14,13 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import org.mozilla.gecko.Actions; import org.mozilla.gecko.Assert; import org.mozilla.gecko.FennecMochitestAssert; +import org.mozilla.gecko.tests.helpers.NavigationHelper; -public abstract class SessionTest extends BaseTest { - protected Navigation mNavigation; - - @Override - public void setUp() throws Exception { - super.setUp(); - - mNavigation = new Navigation(mDevice); - } +import static org.mozilla.gecko.tests.components.AppMenuComponent.MenuItem; +public abstract class SessionTest extends UITest { /** * A generic session object representing a collection of items that has a * selected index. @@ -135,8 +130,8 @@ public void goForward() {} */ protected void loadSessionTabs(Session session) { // Verify initial about:home tab - verifyTabCount(1); - verifyUrl(mStringHelper.ABOUT_HOME_URL); + mToolbar.assertTabCount(1); + mToolbar.assertTitle(mStringHelper.ABOUT_HOME_URL); SessionTab[] tabs = session.getItems(); for (int i = 0; i < tabs.length; i++) { @@ -152,26 +147,20 @@ protected void loadSessionTabs(Session session) { // create a new one. Otherwise, create a new tab if we're loading // the first the first page in the set. if (i > 0) { - addTab(); + mAppMenu.pressMenuItem(MenuItem.NEW_TAB); } for (int j = 1; j < pages.length; j++) { - final Actions.EventExpecter pageShowExpecter = - mActions.expectGlobalEvent(Actions.EventType.UI, "Content:PageShow"); - - loadUrl(pages[j].url); - - pageShowExpecter.blockForEvent(); - pageShowExpecter.unregisterListener(); + NavigationHelper.enterAndLoadUrl(pages[j].url); } final int index = tab.getIndex(); for (int j = pages.length - 1; j > index; j--) { - mNavigation.back(); + NavigationHelper.goBack(); } } - selectTabAt(session.getIndex()); + mTabsPanel.selectTabAt(session.getIndex()); } /** @@ -180,7 +169,7 @@ protected void loadSessionTabs(Session session) { * @param session Session to verify */ protected void verifySessionTabs(Session session) { - verifyTabCount(session.getItems().length); + mToolbar.assertTabCount(session.getItems().length); (new NavigationWalker(session) { boolean mFirstTabVisited; @@ -189,7 +178,7 @@ protected void verifySessionTabs(Session session) { public void onItem(SessionTab tab, int currentIndex) { // The first tab to check should already be selected at startup if (mFirstTabVisited) { - selectTabAt(currentIndex); + mTabsPanel.selectTabAt(currentIndex); } else { mFirstTabVisited = true; } @@ -197,27 +186,17 @@ public void onItem(SessionTab tab, int currentIndex) { (new NavigationWalker(tab) { @Override public void onItem(PageInfo page, int currentIndex) { - final String text; - if (mStringHelper.ABOUT_HOME_URL.equals(page.url)) { - text = mStringHelper.TITLE_PLACE_HOLDER; - } else if (page.url.startsWith(URL_HTTP_PREFIX)) { - text = page.url.substring(URL_HTTP_PREFIX.length()); - } else { - text = page.url; - } - waitForText(text); - - verifyUrlBarTitle(page.url); + mToolbar.assertTitle(page.url); } @Override public void goBack() { - mNavigation.back(); + NavigationHelper.goBack(); } @Override public void goForward() { - mNavigation.forward(); + NavigationHelper.goForward(); } }).walk(); } @@ -264,7 +243,7 @@ protected String buildSessionJSON(Session session) { window.put("selected", session.getIndex() + 1); sessionString = new JSONObject().put("windows", new JSONArray().put(window)).toString(); } catch (JSONException e) { - mAsserter.ok(false, "JSON exception", getStackTraceString(e)); + mAsserter.ok(false, "JSON exception", Log.getStackTraceString(e)); } return sessionString; @@ -316,7 +295,7 @@ protected void verifySessionJSON(Session session, String sessionString, Assert a } } } catch (JSONException e) { - asserter.ok(false, "JSON exception", getStackTraceString(e)); + asserter.ok(false, "JSON exception", Log.getStackTraceString(e)); } } @@ -357,14 +336,14 @@ public void ok(boolean condition, String name, String diag) { * @return URL of the page */ protected String getPage(String id) { - return getAbsoluteUrl("/robocop/robocop_dynamic.sjs?id=" + id); + return getAbsoluteHostnameUrl("/robocop/robocop_dynamic.sjs?id=" + id); } protected String readProfileFile(String filename) { try { return readFile(new File(mProfile, filename)); } catch (IOException e) { - mAsserter.ok(false, "Error reading" + filename, getStackTraceString(e)); + mAsserter.ok(false, "Error reading" + filename, Log.getStackTraceString(e)); } return null; } @@ -373,7 +352,7 @@ protected void writeProfileFile(String filename, String data) { try { writeFile(new File(mProfile, filename), data); } catch (IOException e) { - mAsserter.ok(false, "Error writing to " + filename, getStackTraceString(e)); + mAsserter.ok(false, "Error writing to " + filename, Log.getStackTraceString(e)); } } diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java index 7abed6c5a1ca7..a57cb6e6b8ff6 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java @@ -29,8 +29,7 @@ * A class representing any interactions that take place on the Toolbar. */ public class ToolbarComponent extends BaseComponent { - - private static final String URL_HTTP_PREFIX = "http://"; + public static final String URL_HTTP_PREFIX = "http://"; // We are waiting up to 30 seconds instead of the default waiting time because reader mode // parsing can take quite some time on slower devices (Bug 1142699) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMRestore.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMRestore.java index 5646311b1a170..8b4bbfa9812a2 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMRestore.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMRestore.java @@ -5,6 +5,8 @@ import android.content.SharedPreferences; import android.os.Bundle; +import org.mozilla.gecko.tests.helpers.GeckoHelper; + /** * Tests session OOM restore behavior. * @@ -48,7 +50,7 @@ public void setActivityIntent(Intent intent) { } public void testSessionOOMRestore() throws Exception { - blockForGeckoReady(); + GeckoHelper.blockForReady(); verifySessionTabs(mSession); } } diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java index 73e196d0fa5df..c4202d3225ba6 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testSessionOOMSave.java @@ -1,5 +1,7 @@ package org.mozilla.gecko.tests; +import android.util.Log; + import org.mozilla.gecko.Actions; import com.robotium.solo.Condition; @@ -41,12 +43,12 @@ public void testSessionOOMSave() { // output. Because of the delay, this part of the test takes ~9 seconds // to pass. VerifyJSONCondition verifyJSONCondition = new VerifyJSONCondition(session); - boolean success = waitForCondition(verifyJSONCondition, SESSION_TIMEOUT); + boolean success = mSolo.waitForCondition(verifyJSONCondition, SESSION_TIMEOUT); if (success) { mAsserter.ok(true, "verified session JSON", null); } else { mAsserter.ok(false, "failed to verify session JSON", - getStackTraceString(verifyJSONCondition.getLastException())); + Log.getStackTraceString(verifyJSONCondition.getLastException())); } } From 34c952211cf2d90becca5cfbb55acf479ff60965 Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Fri, 17 Mar 2017 22:14:18 +0100 Subject: [PATCH 020/300] Bug 1348086 - Part 6 - Remove selectTabAt() from BaseTest. r=gbrown SessionTest was the last one using that method. Since all new tests should be UITest-based, we can therefore remove it from BaseTest. MozReview-Commit-ID: EfzlFeu3CDh --- .../src/org/mozilla/gecko/tests/BaseTest.java | 62 ------------------- 1 file changed, 62 deletions(-) diff --git a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java index f0d94dedc96cc..e30bb61f09dc3 100644 --- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/BaseTest.java @@ -611,68 +611,6 @@ public void closeAddedTabs() { } } - /** - * Gets the RecyclerView of the tabs list. - * - * @return List view in the tabs panel - */ - private final RecyclerView getTabsLayout() { - Element tabs = mDriver.findElement(getActivity(), R.id.tabs); - tabs.click(); - return (RecyclerView) getActivity().findViewById(R.id.normal_tabs); - } - - /** - * Gets the view in the tabs panel at the specified index. - * - * @return View at index - */ - private View getTabViewAt(final int index) { - final View[] childView = { null }; - - final RecyclerView view = getTabsLayout(); - - runOnUiThreadSync(new Runnable() { - @Override - public void run() { - view.scrollToPosition(index); - - // The selection isn't updated synchronously; posting a - // runnable to the view's queue guarantees we'll run after the - // layout pass. - view.post(new Runnable() { - @Override - public void run() { - // Index is relative to all views in the list. - final RecyclerView.ViewHolder itemViewHolder = - view.findViewHolderForLayoutPosition(index); - childView[0] = itemViewHolder == null ? null : itemViewHolder.itemView; - } - }); - } - }); - - boolean result = waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return childView[0] != null; - } - }, MAX_WAIT_MS); - - mAsserter.ok(result, "list item at index " + index + " exists", null); - - return childView[0]; - } - - /** - * Selects the tab at the specified index. - * - * @param index Index of tab to select - */ - public void selectTabAt(final int index) { - mSolo.clickOnView(getTabViewAt(index)); - } - public final void runOnUiThreadSync(Runnable runnable) { RobocopUtils.runOnUiThreadSync(getActivity(), runnable); } From 9f8bfb8819a176af4c664215fbfc30247c17950d Mon Sep 17 00:00:00 2001 From: Jan Henning Date: Mon, 5 Sep 2016 20:51:28 +0200 Subject: [PATCH 021/300] Bug 1348086 - Part 7 - Reenable Robocop session store tests. r=gbrown MozReview-Commit-ID: KfVEBXoVdeR --- mobile/android/tests/browser/robocop/robocop.ini | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mobile/android/tests/browser/robocop/robocop.ini b/mobile/android/tests/browser/robocop/robocop.ini index ab2a466b38c72..4d908deeb88dc 100644 --- a/mobile/android/tests/browser/robocop/robocop.ini +++ b/mobile/android/tests/browser/robocop/robocop.ini @@ -62,11 +62,7 @@ skip-if = android_version == "18" # disabled on 4.3, bug 1145867 skip-if = android_version == "18" [src/org/mozilla/gecko/tests/testSessionOOMSave.java] -# disabled on 4.3, bug 1144888 -skip-if = android_version == "18" [src/org/mozilla/gecko/tests/testSessionOOMRestore.java] -# disabled on 4.3, bug 1145879 -skip-if = android_version == "18" # [src/org/mozilla/gecko/tests/testShareLink.java] # see bug 915897 # [src/org/mozilla/gecko/tests/testThumbnails.java] # see bug 813107 # [src/org/mozilla/gecko/tests/testVkbOverlap.java] # see bug 907274 From a9f247d75bb4cd49672735ef351c2e0834a3b409 Mon Sep 17 00:00:00 2001 From: Jeff Gilbert Date: Wed, 22 Mar 2017 17:07:25 -0400 Subject: [PATCH 022/300] Bug 1333858 - Intersect should be fallible on overflow. r=daoshengmu MozReview-Commit-ID: 6lmIKKyXXah --- dom/canvas/WebGLContext.cpp | 60 +++++++++++++++++++++---------- dom/canvas/WebGLContext.h | 7 ++-- dom/canvas/WebGLContextGL.cpp | 34 +++++++++++------- dom/canvas/WebGLTextureUpload.cpp | 14 +++++--- 4 files changed, 74 insertions(+), 41 deletions(-) diff --git a/dom/canvas/WebGLContext.cpp b/dom/canvas/WebGLContext.cpp index 82f382f63471a..52fdd160824d1 100644 --- a/dom/canvas/WebGLContext.cpp +++ b/dom/canvas/WebGLContext.cpp @@ -2225,25 +2225,47 @@ ScopedLazyBind::UnwrapImpl() //////////////////////////////////////// -void -Intersect(uint32_t srcSize, int32_t dstStartInSrc, uint32_t dstSize, - uint32_t* const out_intStartInSrc, uint32_t* const out_intStartInDst, - uint32_t* const out_intSize) -{ - // Only >0 if dstStartInSrc is >0: - // 0 3 // src coords - // | [========] // dst box - // ^--^ - *out_intStartInSrc = std::max(0, dstStartInSrc); - - // Only >0 if dstStartInSrc is <0: - //-6 0 // src coords - // [=====|==] // dst box - // ^-----^ - *out_intStartInDst = std::max(0, 0 - dstStartInSrc); - - int32_t intEndInSrc = std::min(srcSize, dstStartInSrc + dstSize); - *out_intSize = std::max(0, intEndInSrc - *out_intStartInSrc); +bool +Intersect(const int32_t srcSize, const int32_t read0, const int32_t readSize, + int32_t* const out_intRead0, int32_t* const out_intWrite0, + int32_t* const out_intSize) +{ + MOZ_ASSERT(srcSize >= 0); + MOZ_ASSERT(readSize >= 0); + const auto read1 = int64_t(read0) + readSize; + + int32_t intRead0 = read0; // Clearly doesn't need validation. + int64_t intWrite0 = 0; + int64_t intSize = readSize; + + if (read1 <= 0 || read0 >= srcSize) { + // Disjoint ranges. + intSize = 0; + } else { + if (read0 < 0) { + const auto diff = int64_t(0) - read0; + MOZ_ASSERT(diff >= 0); + intRead0 = 0; + intWrite0 = diff; + intSize -= diff; + } + if (read1 > srcSize) { + const auto diff = int64_t(read1) - srcSize; + MOZ_ASSERT(diff >= 0); + intSize -= diff; + } + + if (!CheckedInt(intWrite0).isValid() || + !CheckedInt(intSize).isValid()) + { + return false; + } + } + + *out_intRead0 = intRead0; + *out_intWrite0 = intWrite0; + *out_intSize = intSize; + return true; } //////////////////////////////////////////////////////////////////////////////// diff --git a/dom/canvas/WebGLContext.h b/dom/canvas/WebGLContext.h index ce0e5e5446181..37ac2929bcd00 100644 --- a/dom/canvas/WebGLContext.h +++ b/dom/canvas/WebGLContext.h @@ -2164,10 +2164,9 @@ class ScopedLazyBind final //// -void -Intersect(uint32_t srcSize, int32_t dstStartInSrc, uint32_t dstSize, - uint32_t* const out_intStartInSrc, uint32_t* const out_intStartInDst, - uint32_t* const out_intSize); +bool +Intersect(int32_t srcSize, int32_t read0, int32_t readSize, int32_t* out_intRead0, + int32_t* out_intWrite0, int32_t* out_intSize); //// diff --git a/dom/canvas/WebGLContextGL.cpp b/dom/canvas/WebGLContextGL.cpp index 0a9ac679d88ff..91328e8f5ae45 100644 --- a/dom/canvas/WebGLContextGL.cpp +++ b/dom/canvas/WebGLContextGL.cpp @@ -1556,18 +1556,32 @@ WebGLContext::ReadPixelsImpl(GLint x, GLint y, GLsizei rawWidth, GLsizei rawHeig return; } + //// + + int32_t readX, readY; + int32_t writeX, writeY; + int32_t rwWidth, rwHeight; + if (!Intersect(srcWidth, x, width, &readX, &writeX, &rwWidth) || + !Intersect(srcHeight, y, height, &readY, &writeY, &rwHeight)) + { + ErrorOutOfMemory("readPixels: Bad subrect selection."); + return; + } + //////////////// // Now that the errors are out of the way, on to actually reading! OnBeforeReadCall(); - uint32_t readX, readY; - uint32_t writeX, writeY; - uint32_t rwWidth, rwHeight; - Intersect(srcWidth, x, width, &readX, &writeX, &rwWidth); - Intersect(srcHeight, y, height, &readY, &writeY, &rwHeight); + if (!rwWidth || !rwHeight) { + // Disjoint rects, so we're done already. + DummyReadFramebufferOperation("readPixels"); + return; + } - if (rwWidth == uint32_t(width) && rwHeight == uint32_t(height)) { + if (uint32_t(rwWidth) == width && + uint32_t(rwHeight) == height) + { DoReadPixelsAndConvert(srcFormat->format, x, y, width, height, packFormat, packType, dest, dataLen, rowStride); return; @@ -1586,12 +1600,6 @@ WebGLContext::ReadPixelsImpl(GLint x, GLint y, GLsizei rawWidth, GLsizei rawHeig //////////////////////////////////// // Read only the in-bounds pixels. - if (!rwWidth || !rwHeight) { - // There aren't any, so we're 'done'. - DummyReadFramebufferOperation("readPixels"); - return; - } - if (IsWebGL2()) { if (!mPixelStore_PackRowLength) { gl->fPixelStorei(LOCAL_GL_PACK_ROW_LENGTH, @@ -1611,7 +1619,7 @@ WebGLContext::ReadPixelsImpl(GLint x, GLint y, GLsizei rawWidth, GLsizei rawHeig uint8_t* row = (uint8_t*)dest + writeX * bytesPerPixel; row += writeY * rowStride; - for (uint32_t j = 0; j < rwHeight; j++) { + for (uint32_t j = 0; j < uint32_t(rwHeight); j++) { DoReadPixelsAndConvert(srcFormat->format, readX, readY+j, rwWidth, 1, packFormat, packType, row, dataLen, rowStride); row += rowStride; diff --git a/dom/canvas/WebGLTextureUpload.cpp b/dom/canvas/WebGLTextureUpload.cpp index b104f38a8200d..80564f8062b23 100644 --- a/dom/canvas/WebGLTextureUpload.cpp +++ b/dom/canvas/WebGLTextureUpload.cpp @@ -2011,11 +2011,15 @@ DoCopyTexOrSubImage(WebGLContext* webgl, const char* funcName, bool isSubImage, //// - uint32_t readX, readY; - uint32_t writeX, writeY; - uint32_t rwWidth, rwHeight; - Intersect(srcTotalWidth, xWithinSrc, dstWidth, &readX, &writeX, &rwWidth); - Intersect(srcTotalHeight, yWithinSrc, dstHeight, &readY, &writeY, &rwHeight); + int32_t readX, readY; + int32_t writeX, writeY; + int32_t rwWidth, rwHeight; + if (!Intersect(srcTotalWidth, xWithinSrc, dstWidth, &readX, &writeX, &rwWidth) || + !Intersect(srcTotalHeight, yWithinSrc, dstHeight, &readY, &writeY, &rwHeight)) + { + webgl->ErrorOutOfMemory("%s: Bad subrect selection.", funcName); + return false; + } writeX += xOffset; writeY += yOffset; From 7396878260216cab4a50d272a7fd899e58df5c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=83=C2=A9bastien=20Blin?= Date: Tue, 17 Jan 2017 07:03:00 -0500 Subject: [PATCH 023/300] Bug 1298321 - Refactor tests related to getHash. r=francois --- .../url-classifier/tests/mochitest/chrome.ini | 3 +- .../url-classifier/tests/mochitest/head.js | 36 +++++++++++++++ .../tests/mochitest/mochitest.ini | 1 + .../tests/mochitest/test_bug1254766.html | 46 ++----------------- .../test_classifier_changetablepref.html | 42 +---------------- .../tests/mochitest/test_gethash.html | 44 ++---------------- 6 files changed, 49 insertions(+), 123 deletions(-) create mode 100644 toolkit/components/url-classifier/tests/mochitest/head.js diff --git a/toolkit/components/url-classifier/tests/mochitest/chrome.ini b/toolkit/components/url-classifier/tests/mochitest/chrome.ini index 01dcf697d7b84..a6fe2539623c2 100644 --- a/toolkit/components/url-classifier/tests/mochitest/chrome.ini +++ b/toolkit/components/url-classifier/tests/mochitest/chrome.ini @@ -9,11 +9,12 @@ support-files = gethash.sjs classifierCommon.js classifierHelper.js + head.js [test_lookup_system_principal.html] [test_classified_annotations.html] tags = trackingprotection -skip-if = os == 'linux' && asan # Bug 1202548 +skip-if = os == 'linux' && asan # Bug 1202548 [test_allowlisted_annotations.html] tags = trackingprotection [test_privatebrowsing_trackingprotection.html] diff --git a/toolkit/components/url-classifier/tests/mochitest/head.js b/toolkit/components/url-classifier/tests/mochitest/head.js new file mode 100644 index 0000000000000..897dff87fac99 --- /dev/null +++ b/toolkit/components/url-classifier/tests/mochitest/head.js @@ -0,0 +1,36 @@ +// calculate the fullhash and send it to gethash server +function addCompletionToServer(list, url, mochitestUrl) { + return new Promise(function(resolve, reject) { + var listParam = "list=" + list; + var fullhashParam = "fullhash=" + hash(url); + + var xhr = new XMLHttpRequest; + xhr.open("PUT", mochitestUrl + "?" + listParam + "&" + fullhashParam, true); + xhr.setRequestHeader("Content-Type", "text/plain"); + xhr.onreadystatechange = function() { + if (this.readyState == this.DONE) { + resolve(); + } + }; + xhr.send(); + }); +} + +function hash(str) { + function bytesFromString(str) { + var converter = + SpecialPowers.Cc["@mozilla.org/intl/scriptableunicodeconverter"] + .createInstance(SpecialPowers.Ci.nsIScriptableUnicodeConverter); + converter.charset = "UTF-8"; + return converter.convertToByteArray(str); + } + + var hasher = SpecialPowers.Cc["@mozilla.org/security/hash;1"] + .createInstance(SpecialPowers.Ci.nsICryptoHash); + + var data = bytesFromString(str); + hasher.init(hasher.SHA256); + hasher.update(data, data.length); + + return hasher.finish(true); +} diff --git a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini index 27671fad59583..303308c553976 100644 --- a/toolkit/components/url-classifier/tests/mochitest/mochitest.ini +++ b/toolkit/components/url-classifier/tests/mochitest/mochitest.ini @@ -6,6 +6,7 @@ support-files = classifierHelper.js cleanWorker.js good.js + head.js evil.css evil.css^headers^ evil.js diff --git a/toolkit/components/url-classifier/tests/mochitest/test_bug1254766.html b/toolkit/components/url-classifier/tests/mochitest/test_bug1254766.html index 1c149406ace98..d8a86e81dd0bc 100644 --- a/toolkit/components/url-classifier/tests/mochitest/test_bug1254766.html +++ b/toolkit/components/url-classifier/tests/mochitest/test_bug1254766.html @@ -13,6 +13,7 @@
 
+
 
 
 
 
   
     
 
   
     
 
+  
+    
+      
+    
+  
+

From 24835943c2612199394f6f8a9a822cefef99b4cc Mon Sep 17 00:00:00 2001
From: Rex Lee 
Date: Tue, 21 Mar 2017 15:35:38 +0800
Subject: [PATCH 044/300] Bug 1317228 - [Mortar][PDF] Implement mouse and
 keyboard control in presentation mode. r=evelyn, f=lchang

MozReview-Commit-ID: FLYox0cU7Ok
---
 .../pdf/chrome/js/presentation-controller.js  | 105 ++++++++++++++++++
 .../mortar/host/pdf/chrome/js/viewer.js       |   1 +
 .../mortar/host/pdf/chrome/js/viewport.js     |  16 ++-
 .../mortar/host/pdf/chrome/viewer.html        |   1 +
 4 files changed, 119 insertions(+), 4 deletions(-)
 create mode 100644 browser/extensions/mortar/host/pdf/chrome/js/presentation-controller.js

diff --git a/browser/extensions/mortar/host/pdf/chrome/js/presentation-controller.js b/browser/extensions/mortar/host/pdf/chrome/js/presentation-controller.js
new file mode 100644
index 0000000000000..a834db1a9511a
--- /dev/null
+++ b/browser/extensions/mortar/host/pdf/chrome/js/presentation-controller.js
@@ -0,0 +1,105 @@
+'use strict';
+
+class PresentationController {
+  constructor(viewport) {
+    this._viewport = viewport;
+
+    viewport.onFullscreenChange = this._onFullscreenChange.bind(this);
+
+    this._wheelTimestamp = 0;
+    this._wheelDelta = 0;
+  }
+
+  _onFullscreenChange(isFullscreen) {
+    if (isFullscreen) {
+      this._viewport.bindUIEvent('click', this);
+      this._viewport.bindUIEvent('wheel', this);
+      this._viewport.bindUIEvent('mousedown', this, true);
+      this._viewport.bindUIEvent('mousemove', this, true);
+    } else {
+      this._viewport.unbindUIEvent('click', this);
+      this._viewport.unbindUIEvent('wheel', this);
+      this._viewport.unbindUIEvent('mousedown', this, true);
+      this._viewport.unbindUIEvent('mousemove', this, true);
+    }
+  }
+
+  _normalizeWheelEventDelta(evt) {
+    let delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);
+    let angle = Math.atan2(evt.deltaY, evt.deltaX);
+    if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {
+      // All that is left-up oriented has to change the sign.
+      delta = -delta;
+    }
+
+    let MOUSE_PIXELS_PER_LINE = 30;
+    let MOUSE_LINES_PER_PAGE = 30;
+
+    // Converts delta to per-page units
+    if (evt.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {
+      delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;
+    } else if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) {
+      delta /= MOUSE_LINES_PER_PAGE;
+    }
+    return delta;
+  }
+
+  _handleWheel(evt) {
+    let delta = this._normalizeWheelEventDelta(evt);
+
+    let WHEEL_COOLDOWN_TIME = 50;
+    let PAGE_SWITCH_THRESHOLD = 0.1;
+
+    let currentTime = new Date().getTime();
+    let storedTime = this._wheelTimestamp;
+
+    // If we've already switched page, avoid accidentally switching again.
+    if (currentTime - storedTime < WHEEL_COOLDOWN_TIME) {
+      return;
+    }
+    // If the scroll direction changed, reset the accumulated scroll delta.
+    if (this._wheelDelta * delta < 0) {
+      this._wheelTimestamp = this._wheelDelta = 0;
+    }
+
+    this._wheelDelta += delta;
+
+    if (Math.abs(this._wheelDelta) >= PAGE_SWITCH_THRESHOLD) {
+      this._wheelDelta > 0 ? this._viewport.page--
+                           : this._viewport.page++;
+      this._wheelDelta = 0;
+      this._wheelTimestamp = currentTime;
+    }
+  }
+
+  handleEvent(evt) {
+    switch(evt.type) {
+      case 'mousedown':
+        // We catch mousedown earlier than runtime to detect if user clicked
+        // on an internal link, by watching changes of page number between
+        // mousedown and mouseup. This is also the main reason we need to invoke
+        // page change on click rather than mousedown event.
+        this._storedPageNum = this._viewport.page;
+        break;
+      case 'mousemove':
+        if (evt.buttons != 0) {
+          // We blocks mousemove when there are buttons clicked to prevent
+          // text selection. Blocking all mousemove rubs the cursor out so
+          // we just block events when there are buttons being pushed.
+          evt.stopImmediatePropagation();
+        }
+        break;
+      case 'click':
+        if (this._storedPageNum != this._viewport.page) {
+          // User may clicked on an internal link already, so we don't do
+          // further page change.
+          return;
+        }
+        this._viewport.page++;
+        break;
+      case 'wheel':
+        this._handleWheel(evt);
+        break;
+    }
+  }
+}
diff --git a/browser/extensions/mortar/host/pdf/chrome/js/viewer.js b/browser/extensions/mortar/host/pdf/chrome/js/viewer.js
index 6aab8890e7ccc..7c2ae52fbce7c 100644
--- a/browser/extensions/mortar/host/pdf/chrome/js/viewer.js
+++ b/browser/extensions/mortar/host/pdf/chrome/js/viewer.js
@@ -7,6 +7,7 @@
 window.addEventListener('DOMContentLoaded', function() {
   let viewport = new Viewport();
   let toolbar = new Toolbar(viewport);
+  let presentationController = new PresentationController(viewport);
   let passwordPrompt = new PasswordPrompt(viewport);
 
   // Expose the custom viewport object to runtime
diff --git a/browser/extensions/mortar/host/pdf/chrome/js/viewport.js b/browser/extensions/mortar/host/pdf/chrome/js/viewport.js
index ba9695e7e8fc7..b2ea4538ae560 100644
--- a/browser/extensions/mortar/host/pdf/chrome/js/viewport.js
+++ b/browser/extensions/mortar/host/pdf/chrome/js/viewport.js
@@ -50,6 +50,7 @@ class Viewport {
     this.onDimensionChanged = null;
     this.onPageChanged = null;
     this.onPasswordRequest = null;
+    this.onFullscreenChange = null;
 
     this._viewportController.addEventListener('scroll', this);
     this._viewportController.addEventListener('copy', this);
@@ -441,6 +442,10 @@ class Viewport {
         this._setZoom(this._computeFittingZoom());
       }
 
+      if (typeof this.onFullscreenChange === 'function') {
+        this.onFullscreenChange(fullscreen);
+      }
+
       this._fullscreenStatus = fullscreen ? 'fullscreen' : 'none';
 
       // Reset position to the beginning of the current page.
@@ -707,7 +712,7 @@ class Viewport {
     return element == this._viewportController;
   }
 
-  bindUIEvent(type, listener) {
+  bindUIEvent(type, listener, useCapture = false) {
     if (type == 'fullscreenchange' || type == 'MozScrolledAreaChanged') {
       // These two events won't be bound on a target because they should be
       // fully controlled by UI layer, and we'll manually trigger the resize
@@ -719,11 +724,11 @@ class Viewport {
         this._runtimeOnResizedListener.push(listener);
         break;
       default:
-        this._getEventTarget(type).addEventListener(type, listener);
+        this._getEventTarget(type).addEventListener(type, listener, useCapture);
     }
   }
 
-  unbindUIEvent(type, listener) {
+  unbindUIEvent(type, listener, useCapture = false) {
     if (type == 'fullscreenchange' || type == 'MozScrolledAreaChanged') {
       return;
     }
@@ -733,7 +738,7 @@ class Viewport {
           this._runtimeOnResizedListener.filter(item => item != listener);
         break;
       default:
-        this._getEventTarget(type).removeEventListener(type, listener);
+        this._getEventTarget(type).removeEventListener(type, listener, useCapture);
     }
   }
 
@@ -774,6 +779,9 @@ class Viewport {
       case 'command':
         this._handleCommand(message.name);
         break;
+      case 'goToPage':
+        this.page = message.page;
+        break;
     }
   }
 }
diff --git a/browser/extensions/mortar/host/pdf/chrome/viewer.html b/browser/extensions/mortar/host/pdf/chrome/viewer.html
index efc212c711ed6..2a92060a0b7ab 100644
--- a/browser/extensions/mortar/host/pdf/chrome/viewer.html
+++ b/browser/extensions/mortar/host/pdf/chrome/viewer.html
@@ -19,6 +19,7 @@
     
     
     
+    
     
           
         
 
 

From fc881a4831037037aada9926b2dc76ae0be369e7 Mon Sep 17 00:00:00 2001
From: Sebastian Hengst 
Date: Wed, 22 Mar 2017 15:26:17 +0100
Subject: [PATCH 045/300] Backed out changeset 354618874505 (bug 1349256)

---
 devtools/docs/SUMMARY.md                                   | 7 +------
 .../{docs/backend => server/docs}/actor-e10s-handling.md   | 0
 devtools/{docs/backend => server/docs}/actor-hierarchy.md  | 0
 .../{docs/backend => server/docs}/actor-registration.md    | 0
 devtools/{docs/backend => server/docs}/protocol.js.md      | 0
 5 files changed, 1 insertion(+), 6 deletions(-)
 rename devtools/{docs/backend => server/docs}/actor-e10s-handling.md (100%)
 rename devtools/{docs/backend => server/docs}/actor-hierarchy.md (100%)
 rename devtools/{docs/backend => server/docs}/actor-registration.md (100%)
 rename devtools/{docs/backend => server/docs}/protocol.js.md (100%)

diff --git a/devtools/docs/SUMMARY.md b/devtools/docs/SUMMARY.md
index e178d96acf293..435b8d21c8855 100644
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -18,11 +18,6 @@
     * [Guidelines](frontend/redux-guidelines.md)
     * [Tips](frontend/redux-tips.md)
 * [Backend](backend/backend.md)
-  * [Remote Debugging Protocol](backend/protocol.md)
+  * [Protocol](backend/protocol.md)
   * [Debugger API](backend/debugger-api.md)
   * [Backward Compatibility](backend/backward-compatibility.md)
-  * Actors
-    * [Actors Organization](backend/actor-hierarchy.md)
-    * [Handling Multi-Processes in Actors](backend/actor-e10s-handling.md)
-    * [Writing Actors With protocol.js](backend/protocol.js.md)
-    * [Registering A New Actor](backend/actor-registration.md)
diff --git a/devtools/docs/backend/actor-e10s-handling.md b/devtools/server/docs/actor-e10s-handling.md
similarity index 100%
rename from devtools/docs/backend/actor-e10s-handling.md
rename to devtools/server/docs/actor-e10s-handling.md
diff --git a/devtools/docs/backend/actor-hierarchy.md b/devtools/server/docs/actor-hierarchy.md
similarity index 100%
rename from devtools/docs/backend/actor-hierarchy.md
rename to devtools/server/docs/actor-hierarchy.md
diff --git a/devtools/docs/backend/actor-registration.md b/devtools/server/docs/actor-registration.md
similarity index 100%
rename from devtools/docs/backend/actor-registration.md
rename to devtools/server/docs/actor-registration.md
diff --git a/devtools/docs/backend/protocol.js.md b/devtools/server/docs/protocol.js.md
similarity index 100%
rename from devtools/docs/backend/protocol.js.md
rename to devtools/server/docs/protocol.js.md

From e368f5fd06ac2654720ac31eaba3b7907fbcac0c Mon Sep 17 00:00:00 2001
From: Sebastian Hengst 
Date: Wed, 22 Mar 2017 15:26:22 +0100
Subject: [PATCH 046/300] Backed out changeset 098a2b99cc1b (bug 1349256)

---
 devtools/docs/tools/debugger-panel.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/devtools/docs/tools/debugger-panel.md b/devtools/docs/tools/debugger-panel.md
index 19d769eee83b9..1cb97dadc20b0 100644
--- a/devtools/docs/tools/debugger-panel.md
+++ b/devtools/docs/tools/debugger-panel.md
@@ -1 +1,2 @@
-You can find the debugger documentation on [the debugger.html GitHub repository](https://devtools-html.github.io/debugger.html/).
\ No newline at end of file
+
+This is just a stub until we write debugger docs.
\ No newline at end of file

From 22aeae12f6936870deb216329f6c96e5337b9732 Mon Sep 17 00:00:00 2001
From: Sebastian Hengst 
Date: Wed, 22 Mar 2017 15:26:26 +0100
Subject: [PATCH 047/300] Backed out changeset c70687e1b94f (bug 1349256)

---
 devtools/docs/README.md | 17 +----------------
 1 file changed, 1 insertion(+), 16 deletions(-)

diff --git a/devtools/docs/README.md b/devtools/docs/README.md
index 77bd61c7a6d96..392f2a422cf6c 100644
--- a/devtools/docs/README.md
+++ b/devtools/docs/README.md
@@ -6,19 +6,4 @@ If you are looking for general docs about how to use the tools, checkout [this M
 
 If you are looking for a getting started guide on the developer tools, all of this information is documented on the [Hacking](https://wiki.mozilla.org/DevTools/Hacking) wiki page.
 
-[GitBook](https://github.com/GitbookIO/gitbook) is used to generate online documentation from the markdown files here.
-Here is how you can re-generate the book:
-
-```bash
-# Install GitBook locally
-npm install -g gitbook-cli
-
-# Go into the docs directory
-cd /path/to/mozilla-central/devtools/docs/
-
-# Generate the docs and start a local server
-gitbook serve
-
-# Or just built the book
-gitbook build
-```
\ No newline at end of file
+Head over to the [table of contents](SUMMARY.md) to browse the documentation.
\ No newline at end of file

From 63171966d9b81e1415ecb2364230bda2b805b24f Mon Sep 17 00:00:00 2001
From: Sebastian Hengst 
Date: Wed, 22 Mar 2017 15:26:30 +0100
Subject: [PATCH 048/300] Backed out changeset fd138b13a8f2 (bug 1349256)

---
 devtools/docs/SUMMARY.md                      |  39 +++++++++---------
 devtools/docs/{backend => }/backend.md        |   0
 .../{backend => }/backward-compatibility.md   |   0
 devtools/docs/{backend => }/debugger-api.md   |   0
 devtools/docs/{tools => }/debugger-panel.md   |   0
 devtools/docs/{frontend => }/frontend.md      |   0
 devtools/docs/{tools => }/highlighters.md     |   2 +-
 devtools/docs/{tools => }/http-inspector.md   |   0
 .../box-model-highlighter-screenshot.png      | Bin
 devtools/docs/{tools => }/inspector-panel.md  |   0
 devtools/docs/{tools => }/inspector.md        |   0
 devtools/docs/{tools => }/memory-panel.md     |   0
 devtools/docs/{backend => }/protocol.md       |   0
 .../docs/{frontend => }/react-guidelines.md   |   0
 devtools/docs/{frontend => }/react-tips.md    |   0
 devtools/docs/{frontend => }/react.md         |   0
 .../docs/{frontend => }/redux-guidelines.md   |   0
 devtools/docs/{frontend => }/redux-tips.md    |   0
 devtools/docs/{frontend => }/redux.md         |   0
 .../{tools => }/responsive-design-mode.md     |   0
 devtools/docs/{frontend => }/svgs.md          |   6 +--
 .../{resources => svgs}/expand-strokes.gif    | Bin
 .../docs/{resources => svgs}/pathfinder.gif   | Bin
 .../{resources => svgs}/sketch-position.png   | Bin
 devtools/docs/{tools => }/tools.md            |   0
 25 files changed, 23 insertions(+), 24 deletions(-)
 rename devtools/docs/{backend => }/backend.md (100%)
 rename devtools/docs/{backend => }/backward-compatibility.md (100%)
 rename devtools/docs/{backend => }/debugger-api.md (100%)
 rename devtools/docs/{tools => }/debugger-panel.md (100%)
 rename devtools/docs/{frontend => }/frontend.md (100%)
 rename devtools/docs/{tools => }/highlighters.md (99%)
 rename devtools/docs/{tools => }/http-inspector.md (100%)
 rename devtools/docs/{resources => img}/box-model-highlighter-screenshot.png (100%)
 rename devtools/docs/{tools => }/inspector-panel.md (100%)
 rename devtools/docs/{tools => }/inspector.md (100%)
 rename devtools/docs/{tools => }/memory-panel.md (100%)
 rename devtools/docs/{backend => }/protocol.md (100%)
 rename devtools/docs/{frontend => }/react-guidelines.md (100%)
 rename devtools/docs/{frontend => }/react-tips.md (100%)
 rename devtools/docs/{frontend => }/react.md (100%)
 rename devtools/docs/{frontend => }/redux-guidelines.md (100%)
 rename devtools/docs/{frontend => }/redux-tips.md (100%)
 rename devtools/docs/{frontend => }/redux.md (100%)
 rename devtools/docs/{tools => }/responsive-design-mode.md (100%)
 rename devtools/docs/{frontend => }/svgs.md (92%)
 rename devtools/docs/{resources => svgs}/expand-strokes.gif (100%)
 rename devtools/docs/{resources => svgs}/pathfinder.gif (100%)
 rename devtools/docs/{resources => svgs}/sketch-position.png (100%)
 rename devtools/docs/{tools => }/tools.md (100%)

diff --git a/devtools/docs/SUMMARY.md b/devtools/docs/SUMMARY.md
index 435b8d21c8855..f6b8c2e29a9cc 100644
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -1,23 +1,22 @@
 
 # Summary
 
-* [Tool Architectures](tools/tools.md)
-  * [Inspector](tools/inspector.md)
-    * [Panel Architecture](tools/inspector-panel.md)
-    * [Highlighters](tools/highlighters.md)
-  * [Memory](tools/memory-panel.md)
-  * [Debugger](tools/debugger-panel.md)
-  * [Responsive Design Mode](tools/responsive-design-mode.md)
-  * [HTTP Inspector](tools/http-inspector.md)
-* [Frontend](frontend/frontend.md)
-  * [Panel SVGs](frontend/svgs.md)
-  * [React](frontend/react.md)
-    * [Guidelines](frontend/react-guidelines.md)
-    * [Tips](frontend/react-tips.md)
-  * [Redux](frontend/redux.md)
-    * [Guidelines](frontend/redux-guidelines.md)
-    * [Tips](frontend/redux-tips.md)
-* [Backend](backend/backend.md)
-  * [Protocol](backend/protocol.md)
-  * [Debugger API](backend/debugger-api.md)
-  * [Backward Compatibility](backend/backward-compatibility.md)
+* [Tool Architectures](tools.md)
+  * [Inspector](inspector.md)
+    * [Panel Architecture](inspector-panel.md)
+    * [Highlighters](highlighters.md)
+  * [Memory](memory-panel.md)
+  * [Debugger](debugger-panel.md)
+  * [Responsive Design Mode](responsive-design-mode.md)
+* [Frontend](frontend.md)
+  * [Panel SVGs](svgs.md)
+  * [React](react.md)
+    * [Guidelines](react-guidelines.md)
+    * [Tips](react-tips.md)
+  * [Redux](redux.md)
+    * [Guidelines](redux-guidelines.md)
+    * [Tips](redux-tips.md)
+* [Backend](backend.md)
+  * [Protocol](protocol.md)
+  * [Debugger API](debugger-api.md)
+  * [Backward Compatibility](backward-compatibility.md)
diff --git a/devtools/docs/backend/backend.md b/devtools/docs/backend.md
similarity index 100%
rename from devtools/docs/backend/backend.md
rename to devtools/docs/backend.md
diff --git a/devtools/docs/backend/backward-compatibility.md b/devtools/docs/backward-compatibility.md
similarity index 100%
rename from devtools/docs/backend/backward-compatibility.md
rename to devtools/docs/backward-compatibility.md
diff --git a/devtools/docs/backend/debugger-api.md b/devtools/docs/debugger-api.md
similarity index 100%
rename from devtools/docs/backend/debugger-api.md
rename to devtools/docs/debugger-api.md
diff --git a/devtools/docs/tools/debugger-panel.md b/devtools/docs/debugger-panel.md
similarity index 100%
rename from devtools/docs/tools/debugger-panel.md
rename to devtools/docs/debugger-panel.md
diff --git a/devtools/docs/frontend/frontend.md b/devtools/docs/frontend.md
similarity index 100%
rename from devtools/docs/frontend/frontend.md
rename to devtools/docs/frontend.md
diff --git a/devtools/docs/tools/highlighters.md b/devtools/docs/highlighters.md
similarity index 99%
rename from devtools/docs/tools/highlighters.md
rename to devtools/docs/highlighters.md
index 758a66d1f093a..d9854b516d531 100644
--- a/devtools/docs/tools/highlighters.md
+++ b/devtools/docs/highlighters.md
@@ -6,7 +6,7 @@ By highlighter, we mean anything that DevTools displays on top of the content pa
 
 The most obvious form of highlighter is the box-model highlighter, whose job is to display the 4 box-model regions on top of a given element in the content page, as illustrated in the following screen capture:
 
-![Box-model highlighter](../resources/box-model-highlighter-screenshot.png)
+![Box-model highlighter](./img/box-model-highlighter-screenshot.png)
 
 But there can be a wide variety of highlighters. In particular, highlighters are a pretty good way to give detailed information about:
 
diff --git a/devtools/docs/tools/http-inspector.md b/devtools/docs/http-inspector.md
similarity index 100%
rename from devtools/docs/tools/http-inspector.md
rename to devtools/docs/http-inspector.md
diff --git a/devtools/docs/resources/box-model-highlighter-screenshot.png b/devtools/docs/img/box-model-highlighter-screenshot.png
similarity index 100%
rename from devtools/docs/resources/box-model-highlighter-screenshot.png
rename to devtools/docs/img/box-model-highlighter-screenshot.png
diff --git a/devtools/docs/tools/inspector-panel.md b/devtools/docs/inspector-panel.md
similarity index 100%
rename from devtools/docs/tools/inspector-panel.md
rename to devtools/docs/inspector-panel.md
diff --git a/devtools/docs/tools/inspector.md b/devtools/docs/inspector.md
similarity index 100%
rename from devtools/docs/tools/inspector.md
rename to devtools/docs/inspector.md
diff --git a/devtools/docs/tools/memory-panel.md b/devtools/docs/memory-panel.md
similarity index 100%
rename from devtools/docs/tools/memory-panel.md
rename to devtools/docs/memory-panel.md
diff --git a/devtools/docs/backend/protocol.md b/devtools/docs/protocol.md
similarity index 100%
rename from devtools/docs/backend/protocol.md
rename to devtools/docs/protocol.md
diff --git a/devtools/docs/frontend/react-guidelines.md b/devtools/docs/react-guidelines.md
similarity index 100%
rename from devtools/docs/frontend/react-guidelines.md
rename to devtools/docs/react-guidelines.md
diff --git a/devtools/docs/frontend/react-tips.md b/devtools/docs/react-tips.md
similarity index 100%
rename from devtools/docs/frontend/react-tips.md
rename to devtools/docs/react-tips.md
diff --git a/devtools/docs/frontend/react.md b/devtools/docs/react.md
similarity index 100%
rename from devtools/docs/frontend/react.md
rename to devtools/docs/react.md
diff --git a/devtools/docs/frontend/redux-guidelines.md b/devtools/docs/redux-guidelines.md
similarity index 100%
rename from devtools/docs/frontend/redux-guidelines.md
rename to devtools/docs/redux-guidelines.md
diff --git a/devtools/docs/frontend/redux-tips.md b/devtools/docs/redux-tips.md
similarity index 100%
rename from devtools/docs/frontend/redux-tips.md
rename to devtools/docs/redux-tips.md
diff --git a/devtools/docs/frontend/redux.md b/devtools/docs/redux.md
similarity index 100%
rename from devtools/docs/frontend/redux.md
rename to devtools/docs/redux.md
diff --git a/devtools/docs/tools/responsive-design-mode.md b/devtools/docs/responsive-design-mode.md
similarity index 100%
rename from devtools/docs/tools/responsive-design-mode.md
rename to devtools/docs/responsive-design-mode.md
diff --git a/devtools/docs/frontend/svgs.md b/devtools/docs/svgs.md
similarity index 92%
rename from devtools/docs/frontend/svgs.md
rename to devtools/docs/svgs.md
index 65603126df51b..90ff0ff5e9852 100644
--- a/devtools/docs/frontend/svgs.md
+++ b/devtools/docs/svgs.md
@@ -24,10 +24,10 @@ You can download a sample Illustrator file [here](https://www.dropbox.com/home/M
 When you're designing your icons in a graphics editor like Adobe Illustrator, there are a lot of things you can do that will bring down the size of the file and make your SVGs easier for the developers to work with. Here are some of them:
 
 - **Expand paths**: Instead of having multiple shapes overlapping each other, expand shapes using the pathfinder.
-![Use pathfinder to expand shapes](../resources/pathfinder.gif)
+![Use pathfinder to expand shapes](./svgs/pathfinder.gif)
 - Simplify paths (```Object``` > ```Path``` > ```Simplify```)
 - Expand objects so that strokes become objects. This has the added benefit of keeping the stroke size intact as the SVG is resized.
-![Expand strokes to make them objects](../resources/expand-strokes.gif)
+![Expand strokes to make them objects](./svgs/expand-strokes.gif)
 
 ## Sketch
 Sketch vector work is a little different but the fundamentals (keeping your SVG small, expanding all paths) is the same. Here's what we've found helps to build clean icons:
@@ -35,7 +35,7 @@ Sketch vector work is a little different but the fundamentals (keeping your SVG
 - **Build your icon at 16x16 with the Pixel Grid turned on.** You can turn the pixel grid on at ```View > Canvas > Show Pixels```
 
 - **Make sure that all x/y coordinates are full pixels for lines/rectangles.** Sub-pixels = not on pixel grid.
-![Position in the upper right hand corner of Sketch](../resources/sketch-position.png)
+![Position in the upper right hand corner of Sketch](./svgs/sketch-position.png)
 
 - **Expand all your paths so strokes expand properly as the SVG gets resized.** You can do this at ```Layer > Paths > Vectorize Stroke```.
 
diff --git a/devtools/docs/resources/expand-strokes.gif b/devtools/docs/svgs/expand-strokes.gif
similarity index 100%
rename from devtools/docs/resources/expand-strokes.gif
rename to devtools/docs/svgs/expand-strokes.gif
diff --git a/devtools/docs/resources/pathfinder.gif b/devtools/docs/svgs/pathfinder.gif
similarity index 100%
rename from devtools/docs/resources/pathfinder.gif
rename to devtools/docs/svgs/pathfinder.gif
diff --git a/devtools/docs/resources/sketch-position.png b/devtools/docs/svgs/sketch-position.png
similarity index 100%
rename from devtools/docs/resources/sketch-position.png
rename to devtools/docs/svgs/sketch-position.png
diff --git a/devtools/docs/tools/tools.md b/devtools/docs/tools.md
similarity index 100%
rename from devtools/docs/tools/tools.md
rename to devtools/docs/tools.md

From 02c9321dd78fa280d8d417da1a8464a53dfe2fca Mon Sep 17 00:00:00 2001
From: Sebastian Hengst 
Date: Wed, 22 Mar 2017 15:27:46 +0100
Subject: [PATCH 049/300] Backed out changeset 7f8066747d03 (bug 1349256) for
 build bustage: test_mozbuild_reading.py docs/memory-panel.md corresponds to
 no files. r=backout

---
 devtools/docs/README.md | 40 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 36 insertions(+), 4 deletions(-)

diff --git a/devtools/docs/README.md b/devtools/docs/README.md
index 392f2a422cf6c..e2a3b8e9e9bb1 100644
--- a/devtools/docs/README.md
+++ b/devtools/docs/README.md
@@ -1,9 +1,41 @@
 # Firefox Developer Tools
 
-Hello! This documentation is for developers who want to work on the developer tools.
+Hello! This documentation is for developers who want to work on the
+developer tools. If you are looking for general docs about how to use
+the tools, checkout [this MDN
+page](https://developer.mozilla.org/en-US/docs/Tools).
 
-If you are looking for general docs about how to use the tools, checkout [this MDN page](https://developer.mozilla.org/en-US/docs/Tools) instead.
+These docs explain how the developer tools work at high-level, as well
+as providing links to reference documentation. This is a good starting
+point if you are a new contributor, or want to learn how our protocol,
+a specific tool, or something else works.
 
-If you are looking for a getting started guide on the developer tools, all of this information is documented on the [Hacking](https://wiki.mozilla.org/DevTools/Hacking) wiki page.
+If you are looking to **start hacking** on the developer tools, all of
+this information is documented on the
+[Hacking](https://wiki.mozilla.org/DevTools/Hacking) wiki page.
 
-Head over to the [table of contents](SUMMARY.md) to browse the documentation.
\ No newline at end of file
+A very quick version:
+
+```
+$ hg clone https://hg.mozilla.org/integration/mozilla-inbound
+$ ./mach build
+$ ./mach run -P development
+```
+
+You can also clone via git from
+`https://github.com/mozilla/gecko-dev.git`. Note that the workflow for
+submitting patches may be a little different if using git.
+
+Please see the [Hacking](https://wiki.mozilla.org/DevTools/Hacking)
+page for a lot more information!
+
+All of our **coding standards** are documented on the [Coding
+Standards](https://wiki.mozilla.org/DevTools/CodingStandards) wiki
+page.
+
+We use ESLint to enforce coding standards, and if you can run it
+straight from the command like this:
+
+```
+./mach eslint path/to/directory
+```

From 205816664867778e7658113f707e9b1d657768de Mon Sep 17 00:00:00 2001
From: Sebastian Hengst 
Date: Wed, 22 Mar 2017 15:37:27 +0100
Subject: [PATCH 050/300] Backed out changeset fd87a4b1a4b5 (bug 1345991) for
 bustage. r=backout

---
 browser/base/content/content.js               |  6 +--
 .../base/content/test/pageinfo/browser.ini    |  4 --
 .../pageinfo/browser_pageInfo_svg_image.js    | 37 -------------------
 .../base/content/test/pageinfo/svg_image.html | 11 ------
 4 files changed, 2 insertions(+), 56 deletions(-)
 delete mode 100644 browser/base/content/test/pageinfo/browser_pageInfo_svg_image.js
 delete mode 100644 browser/base/content/test/pageinfo/svg_image.html

diff --git a/browser/base/content/content.js b/browser/base/content/content.js
index 322ef03b3f788..8f241930b50df 100644
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -1258,10 +1258,8 @@ var PageInfoListener = {
       try {
         // Note: makeURLAbsolute will throw if either the baseURI is not a valid URI
         //       or the URI formed from the baseURI and the URL is not a valid URI.
-        if (elem.href.baseVal) {
-          let href = Services.io.newURI(elem.href.baseVal, null, Services.io.newURI(elem.baseURI)).spec;
-          addImage(href, strings.mediaImg, "", elem, false);
-        }
+        let href = makeURLAbsolute(elem.baseURI, elem.href.baseVal);
+        addImage(href, strings.mediaImg, "", elem, false);
       } catch (e) { }
     } else if (elem instanceof content.HTMLVideoElement) {
       addImage(elem.currentSrc, strings.mediaVideo, "", elem, false);
diff --git a/browser/base/content/test/pageinfo/browser.ini b/browser/base/content/test/pageinfo/browser.ini
index e5021c8f2e071..cdd3dc6a9bd73 100644
--- a/browser/base/content/test/pageinfo/browser.ini
+++ b/browser/base/content/test/pageinfo/browser.ini
@@ -6,7 +6,3 @@ support-files =
 [browser_pageinfo_images.js]
 [browser_pageinfo_image_info.js]
 skip-if = (os == 'linux' && e10s) # bug 1161699
-[browser_pageinfo_svg_image.js]
-support-files =
-  svg_image.html
-  ../general/title_test.svg
diff --git a/browser/base/content/test/pageinfo/browser_pageInfo_svg_image.js b/browser/base/content/test/pageinfo/browser_pageInfo_svg_image.js
deleted file mode 100644
index 1912cc7adeb4d..0000000000000
--- a/browser/base/content/test/pageinfo/browser_pageInfo_svg_image.js
+++ /dev/null
@@ -1,37 +0,0 @@
-function test() {
-  waitForExplicitFinish();
-
-  gBrowser.selectedTab = gBrowser.addTab();
-
-  gBrowser.selectedBrowser.addEventListener("load", function() {
-    var pageInfo = BrowserPageInfo(gBrowser.selectedBrowser.currentURI.spec,
-                                   "mediaTab");
-
-    pageInfo.addEventListener("load", function() {
-      pageInfo.onFinished.push(function() {
-        executeSoon(function() {
-          var imageTree = pageInfo.document.getElementById("imagetree");
-          var imageRowsNum = imageTree.view.rowCount;
-
-          ok(imageTree, "Image tree is null (media tab is broken)");
-
-          is(imageRowsNum, 1, "should have one image");
-
-          // Only bother running this if we've got the right number of rows.
-          if (imageRowsNum == 1) {
-            is(imageTree.view.getCellText(0, imageTree.columns[0]),
-               "https://example.com/browser/browser/base/content/test/pageinfo/title_test.svg",
-               "The URL should be the svg image.");
-          }
-
-          pageInfo.close();
-          gBrowser.removeCurrentTab();
-          finish();
-        });
-      });
-    }, {capture: true, once: true});
-  }, {capture: true, once: true});
-
-  content.location =
-    "https://example.com/browser/browser/base/content/test/pageinfo/svg_image.html";
-}
diff --git a/browser/base/content/test/pageinfo/svg_image.html b/browser/base/content/test/pageinfo/svg_image.html
deleted file mode 100644
index 7ab17c33a0967..0000000000000
--- a/browser/base/content/test/pageinfo/svg_image.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-  
-    Test for page info svg images
-          
         
 
-  
-    
-      
-    
-  
-

From 699a17fbf99263d0d6b85a456680d292eeeabdcf Mon Sep 17 00:00:00 2001
From: Mark Banner 
Date: Mon, 20 Mar 2017 23:40:44 +0100
Subject: [PATCH 051/300] Bug 1345991 - SVG Image Elements aren't displayed in
 the Page Info view media list. r=florian

MozReview-Commit-ID: LlHwl2Kn1Vk
---
 browser/base/content/content.js               |  6 ++-
 .../base/content/test/pageinfo/browser.ini    |  4 ++
 .../pageinfo/browser_pageinfo_svg_image.js    | 37 +++++++++++++++++++
 .../base/content/test/pageinfo/svg_image.html | 11 ++++++
 4 files changed, 56 insertions(+), 2 deletions(-)
 create mode 100644 browser/base/content/test/pageinfo/browser_pageinfo_svg_image.js
 create mode 100644 browser/base/content/test/pageinfo/svg_image.html

diff --git a/browser/base/content/content.js b/browser/base/content/content.js
index 8f241930b50df..322ef03b3f788 100644
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -1258,8 +1258,10 @@ var PageInfoListener = {
       try {
         // Note: makeURLAbsolute will throw if either the baseURI is not a valid URI
         //       or the URI formed from the baseURI and the URL is not a valid URI.
-        let href = makeURLAbsolute(elem.baseURI, elem.href.baseVal);
-        addImage(href, strings.mediaImg, "", elem, false);
+        if (elem.href.baseVal) {
+          let href = Services.io.newURI(elem.href.baseVal, null, Services.io.newURI(elem.baseURI)).spec;
+          addImage(href, strings.mediaImg, "", elem, false);
+        }
       } catch (e) { }
     } else if (elem instanceof content.HTMLVideoElement) {
       addImage(elem.currentSrc, strings.mediaVideo, "", elem, false);
diff --git a/browser/base/content/test/pageinfo/browser.ini b/browser/base/content/test/pageinfo/browser.ini
index cdd3dc6a9bd73..e5021c8f2e071 100644
--- a/browser/base/content/test/pageinfo/browser.ini
+++ b/browser/base/content/test/pageinfo/browser.ini
@@ -6,3 +6,7 @@ support-files =
 [browser_pageinfo_images.js]
 [browser_pageinfo_image_info.js]
 skip-if = (os == 'linux' && e10s) # bug 1161699
+[browser_pageinfo_svg_image.js]
+support-files =
+  svg_image.html
+  ../general/title_test.svg
diff --git a/browser/base/content/test/pageinfo/browser_pageinfo_svg_image.js b/browser/base/content/test/pageinfo/browser_pageinfo_svg_image.js
new file mode 100644
index 0000000000000..1912cc7adeb4d
--- /dev/null
+++ b/browser/base/content/test/pageinfo/browser_pageinfo_svg_image.js
@@ -0,0 +1,37 @@
+function test() {
+  waitForExplicitFinish();
+
+  gBrowser.selectedTab = gBrowser.addTab();
+
+  gBrowser.selectedBrowser.addEventListener("load", function() {
+    var pageInfo = BrowserPageInfo(gBrowser.selectedBrowser.currentURI.spec,
+                                   "mediaTab");
+
+    pageInfo.addEventListener("load", function() {
+      pageInfo.onFinished.push(function() {
+        executeSoon(function() {
+          var imageTree = pageInfo.document.getElementById("imagetree");
+          var imageRowsNum = imageTree.view.rowCount;
+
+          ok(imageTree, "Image tree is null (media tab is broken)");
+
+          is(imageRowsNum, 1, "should have one image");
+
+          // Only bother running this if we've got the right number of rows.
+          if (imageRowsNum == 1) {
+            is(imageTree.view.getCellText(0, imageTree.columns[0]),
+               "https://example.com/browser/browser/base/content/test/pageinfo/title_test.svg",
+               "The URL should be the svg image.");
+          }
+
+          pageInfo.close();
+          gBrowser.removeCurrentTab();
+          finish();
+        });
+      });
+    }, {capture: true, once: true});
+  }, {capture: true, once: true});
+
+  content.location =
+    "https://example.com/browser/browser/base/content/test/pageinfo/svg_image.html";
+}
diff --git a/browser/base/content/test/pageinfo/svg_image.html b/browser/base/content/test/pageinfo/svg_image.html
new file mode 100644
index 0000000000000..7ab17c33a0967
--- /dev/null
+++ b/browser/base/content/test/pageinfo/svg_image.html
@@ -0,0 +1,11 @@
+
+
+  
+    Test for page info svg images
+          
         
 
+  
+    
+      
+    
+  
+

From d35acbecf5f023411193929ee10dd158c8d6371e Mon Sep 17 00:00:00 2001
From: Subhdeep Saha 
Date: Fri, 10 Mar 2017 14:59:49 +0530
Subject: [PATCH 052/300] Bug 1344743 - Update TelemetryStorage.jsm to async
 function & await. r=Dexter

MozReview-Commit-ID: 7stlyHefdbr
---
 .../components/telemetry/TelemetryStorage.jsm | 260 +++++++++---------
 1 file changed, 130 insertions(+), 130 deletions(-)

diff --git a/toolkit/components/telemetry/TelemetryStorage.jsm b/toolkit/components/telemetry/TelemetryStorage.jsm
index bfd308102b819..be0fb31be126c 100644
--- a/toolkit/components/telemetry/TelemetryStorage.jsm
+++ b/toolkit/components/telemetry/TelemetryStorage.jsm
@@ -419,9 +419,9 @@ this.TelemetryStorage = {
    * @return {Promise} A promise resolved with the ping content or rejected if the
    *                           ping contains invalid data.
    */
-  loadPingFile: Task.async(function* (aFilePath) {
+  async loadPingFile(aFilePath) {
     return TelemetryStorageImpl.loadPingFile(aFilePath);
-  }),
+  },
 
   /**
    * Remove FHR database files. This is temporary and will be dropped in
@@ -605,33 +605,33 @@ var TelemetryStorageImpl = {
    *
    * @return {Promise} Promise that is resolved when shutdown is complete.
    */
-  shutdown: Task.async(function*() {
+  async shutdown() {
     this._shutdown = true;
 
     // If the following tasks are still running, block on them. They will bail out as soon
     // as possible.
-    yield this._abortedSessionSerializer.flushTasks().catch(ex => {
+    await this._abortedSessionSerializer.flushTasks().catch(ex => {
       this._log.error("shutdown - failed to flush aborted-session writes", ex);
     });
 
-    yield this._deletionPingSerializer.flushTasks().catch(ex => {
+    await this._deletionPingSerializer.flushTasks().catch(ex => {
       this._log.error("shutdown - failed to flush deletion ping writes", ex);
     });
 
     if (this._cleanArchiveTask) {
-      yield this._cleanArchiveTask.catch(ex => {
+      await this._cleanArchiveTask.catch(ex => {
         this._log.error("shutdown - the archive cleaning task failed", ex);
       });
     }
 
     if (this._enforcePendingPingsQuotaTask) {
-      yield this._enforcePendingPingsQuotaTask.catch(ex => {
+      await this._enforcePendingPingsQuotaTask.catch(ex => {
         this._log.error("shutdown - the pending pings quota task failed", ex);
       });
     }
 
     if (this._removePendingPingsTask) {
-      yield this._removePendingPingsTask.catch(ex => {
+      await this._removePendingPingsTask.catch(ex => {
         this._log.error("shutdown - the pending pings removal task failed", ex);
       });
     }
@@ -640,8 +640,8 @@ var TelemetryStorageImpl = {
     // blockers in place, we a) have seen weird errors being reported that might
     // indicate a bad shutdown path and b) might have completion handlers hanging
     // off the save operations that don't expect to be late in shutdown.
-    yield this.promisePendingPingSaves();
-  }),
+    await this.promisePendingPingSaves();
+  },
 
   /**
    * Save an archived ping to disk.
@@ -657,7 +657,7 @@ var TelemetryStorageImpl = {
     return promise;
   },
 
-  _saveArchivedPingTask: Task.async(function*(ping) {
+  async _saveArchivedPingTask(ping) {
     const creationDate = new Date(ping.creationDate);
     if (this._archivedPings.has(ping.id)) {
       const data = this._archivedPings.get(ping.id);
@@ -670,9 +670,9 @@ var TelemetryStorageImpl = {
 
     // Get the archived ping path and append the lz4 suffix to it (so we have 'jsonlz4').
     const filePath = getArchivedPingPath(ping.id, creationDate, ping.type) + "lz4";
-    yield OS.File.makeDir(OS.Path.dirname(filePath), { ignoreExisting: true,
+    await OS.File.makeDir(OS.Path.dirname(filePath), { ignoreExisting: true,
                                                        from: OS.Constants.Path.profileDir });
-    yield this.savePingToFile(ping, filePath, /* overwrite*/ true, /* compressed*/ true);
+    await this.savePingToFile(ping, filePath, /* overwrite*/ true, /* compressed*/ true);
 
     this._archivedPings.set(ping.id, {
       timestampCreated: creationDate.getTime(),
@@ -681,7 +681,7 @@ var TelemetryStorageImpl = {
 
     Telemetry.getHistogramById("TELEMETRY_ARCHIVE_SESSION_PING_COUNT").add();
     return undefined;
-  }),
+  },
 
   /**
    * Load an archived ping from disk.
@@ -689,7 +689,7 @@ var TelemetryStorageImpl = {
    * @param {string} id The pings id.
    * @return {promise} Promise that is resolved with the ping data.
    */
-  loadArchivedPing: Task.async(function*(id) {
+  async loadArchivedPing(id) {
     const data = this._archivedPings.get(id);
     if (!data) {
       this._log.trace("loadArchivedPing - no ping with id: " + id);
@@ -700,13 +700,13 @@ var TelemetryStorageImpl = {
     const pathCompressed = path + "lz4";
 
     // Purge pings which are too big.
-    let checkSize = function*(path) {
-      const fileSize = (yield OS.File.stat(path)).size;
+    let checkSize = async function(path) {
+      const fileSize = (await OS.File.stat(path)).size;
       if (fileSize > PING_FILE_MAXIMUM_SIZE_BYTES) {
         Telemetry.getHistogramById("TELEMETRY_DISCARDED_ARCHIVED_PINGS_SIZE_MB")
                  .add(Math.floor(fileSize / 1024 / 1024));
         Telemetry.getHistogramById("TELEMETRY_PING_SIZE_EXCEEDED_ARCHIVED").add();
-        yield OS.File.remove(path, {ignoreAbsent: true});
+        await OS.File.remove(path, {ignoreAbsent: true});
         throw new Error("loadArchivedPing - exceeded the maximum ping size: " + fileSize);
       }
     };
@@ -714,18 +714,18 @@ var TelemetryStorageImpl = {
     try {
       // Try to load a compressed version of the archived ping first.
       this._log.trace("loadArchivedPing - loading ping from: " + pathCompressed);
-      yield* checkSize(pathCompressed);
-      return yield this.loadPingFile(pathCompressed, /* compressed*/ true);
+      await checkSize(pathCompressed);
+      return await this.loadPingFile(pathCompressed, /* compressed*/ true);
     } catch (ex) {
       if (!ex.becauseNoSuchFile) {
         throw ex;
       }
       // If that fails, look for the uncompressed version.
       this._log.trace("loadArchivedPing - compressed ping not found, loading: " + path);
-      yield* checkSize(path);
-      return yield this.loadPingFile(path, /* compressed*/ false);
+      await checkSize(path);
+      return await this.loadPingFile(path, /* compressed*/ false);
     }
-  }),
+  },
 
   /**
    * Saves session data to disk.
@@ -734,18 +734,18 @@ var TelemetryStorageImpl = {
     return this._stateSaveSerializer.enqueueTask(() => this._saveSessionData(sessionData));
   },
 
-  _saveSessionData: Task.async(function* (sessionData) {
+  async _saveSessionData(sessionData) {
     let dataDir = OS.Path.join(OS.Constants.Path.profileDir, DATAREPORTING_DIR);
-    yield OS.File.makeDir(dataDir);
+    await OS.File.makeDir(dataDir);
 
     let filePath = OS.Path.join(gDataReportingDir, SESSION_STATE_FILE_NAME);
     try {
-      yield CommonUtils.writeJSON(sessionData, filePath);
+      await CommonUtils.writeJSON(sessionData, filePath);
     } catch (e) {
       this._log.error("_saveSessionData - Failed to write session data to " + filePath, e);
       Telemetry.getHistogramById("TELEMETRY_SESSIONDATA_FAILED_SAVE").add(1);
     }
-  }),
+  },
 
   /**
    * Loads session data from the session data file.
@@ -756,12 +756,12 @@ var TelemetryStorageImpl = {
     return this._stateSaveSerializer.enqueueTask(() => this._loadSessionData());
   },
 
-  _loadSessionData: Task.async(function* () {
+  async _loadSessionData() {
     const dataFile = OS.Path.join(OS.Constants.Path.profileDir, DATAREPORTING_DIR,
                                   SESSION_STATE_FILE_NAME);
     let content;
     try {
-      content = yield OS.File.read(dataFile, { encoding: "utf-8" });
+      content = await OS.File.read(dataFile, { encoding: "utf-8" });
     } catch (ex) {
       this._log.info("_loadSessionData - can not load session data file", ex);
       Telemetry.getHistogramById("TELEMETRY_SESSIONDATA_FAILED_LOAD").add(1);
@@ -778,7 +778,7 @@ var TelemetryStorageImpl = {
     }
 
     return data;
-  }),
+  },
 
   /**
    * Remove an archived ping from disk.
@@ -788,17 +788,17 @@ var TelemetryStorageImpl = {
    * @param {string} type The pings type.
    * @return {promise} Promise that is resolved when the pings is removed.
    */
-  _removeArchivedPing: Task.async(function*(id, timestampCreated, type) {
+  async _removeArchivedPing(id, timestampCreated, type) {
     this._log.trace("_removeArchivedPing - id: " + id + ", timestampCreated: " + timestampCreated + ", type: " + type);
     const path = getArchivedPingPath(id, new Date(timestampCreated), type);
     const pathCompressed = path + "lz4";
 
     this._log.trace("_removeArchivedPing - removing ping from: " + path);
-    yield OS.File.remove(path, {ignoreAbsent: true});
-    yield OS.File.remove(pathCompressed, {ignoreAbsent: true});
+    await OS.File.remove(path, {ignoreAbsent: true});
+    await OS.File.remove(pathCompressed, {ignoreAbsent: true});
     // Remove the ping from the cache.
     this._archivedPings.delete(id);
-  }),
+  },
 
   /**
    * Clean the pings archive by removing old pings.
@@ -822,13 +822,13 @@ var TelemetryStorageImpl = {
    * Removes pings which are too old from the pings archive.
    * @return {Promise} Resolved when the ping age check is complete.
    */
-  _purgeOldPings: Task.async(function*() {
+  async _purgeOldPings() {
     this._log.trace("_purgeOldPings");
 
     const nowDate = Policy.now();
     const startTimeStamp = nowDate.getTime();
     let dirIterator = new OS.File.DirectoryIterator(gPingsArchivePath);
-    let subdirs = (yield dirIterator.nextBatch()).filter(e => e.isDir);
+    let subdirs = (await dirIterator.nextBatch()).filter(e => e.isDir);
     dirIterator.close();
 
     // Keep track of the newest removed month to update the cache, if needed.
@@ -857,7 +857,7 @@ var TelemetryStorageImpl = {
       // If this archive directory is older than 180 days, remove it.
       if ((startTimeStamp - archiveDate.getTime()) > MAX_ARCHIVED_PINGS_RETENTION_MS) {
         try {
-          yield OS.File.removeDir(dir.path);
+          await OS.File.removeDir(dir.path);
           evictedDirsCount++;
 
           // Update the newest removed month.
@@ -873,7 +873,7 @@ var TelemetryStorageImpl = {
     }
 
     // Trigger scanning of the archived pings.
-    yield this.loadArchivedPingList();
+    await this.loadArchivedPingList();
 
     // Refresh the cache: we could still skip this, but it's cheap enough to keep it
     // to avoid introducing task dependencies.
@@ -898,13 +898,13 @@ var TelemetryStorageImpl = {
              .add(Math.ceil(endTimeStamp - startTimeStamp));
     Telemetry.getHistogramById("TELEMETRY_ARCHIVE_OLDEST_DIRECTORY_AGE")
              .add(maxDirAgeInMonths);
-  }),
+  },
 
   /**
    * Enforce a disk quota for the pings archive.
    * @return {Promise} Resolved when the quota check is complete.
    */
-  _enforceArchiveQuota: Task.async(function*() {
+  async _enforceArchiveQuota() {
     this._log.trace("_enforceArchiveQuota");
     let startTimeStamp = Policy.now().getTime();
 
@@ -935,7 +935,7 @@ var TelemetryStorageImpl = {
 
       // Get the size for this ping.
       const fileSize =
-        yield getArchivedPingSize(ping.id, new Date(ping.timestampCreated), ping.type);
+        await getArchivedPingSize(ping.id, new Date(ping.timestampCreated), ping.type);
       if (!fileSize) {
         this._log.warn("_enforceArchiveQuota - Unable to find the size of ping " + ping.id);
         continue;
@@ -946,7 +946,7 @@ var TelemetryStorageImpl = {
         this._log.error("_enforceArchiveQuota - removing file exceeding size limit, size: " + fileSize);
         // We just remove the ping from the disk, we don't bother removing it from pingList
         // since it won't contribute to the quota.
-        yield this._removeArchivedPing(ping.id, ping.timestampCreated, ping.type)
+        await this._removeArchivedPing(ping.id, ping.timestampCreated, ping.type)
                   .catch(e => this._log.error("_enforceArchiveQuota - failed to remove archived ping" + ping.id));
         Telemetry.getHistogramById("TELEMETRY_DISCARDED_ARCHIVED_PINGS_SIZE_MB")
                  .add(Math.floor(fileSize / 1024 / 1024));
@@ -997,38 +997,38 @@ var TelemetryStorageImpl = {
 
       // This list is guaranteed to be in order, so remove the pings at its
       // beginning (oldest).
-      yield this._removeArchivedPing(ping.id, ping.timestampCreated, ping.type);
+      await this._removeArchivedPing(ping.id, ping.timestampCreated, ping.type);
     }
 
     const endTimeStamp = Policy.now().getTime();
     submitProbes(ARCHIVE_SIZE_PROBE_SPECIAL_VALUE, pingsToPurge.length,
                  Math.ceil(endTimeStamp - startTimeStamp));
-  }),
+  },
 
-  _cleanArchive: Task.async(function*() {
+  async _cleanArchive() {
     this._log.trace("cleanArchiveTask");
 
-    if (!(yield OS.File.exists(gPingsArchivePath))) {
+    if (!(await OS.File.exists(gPingsArchivePath))) {
       return;
     }
 
     // Remove pings older than 180 days.
     try {
-      yield this._purgeOldPings();
+      await this._purgeOldPings();
     } catch (ex) {
       this._log.error("_cleanArchive - There was an error removing old directories", ex);
     }
 
     // Make sure we respect the archive disk quota.
-    yield this._enforceArchiveQuota();
-  }),
+    await this._enforceArchiveQuota();
+  },
 
   /**
    * Run the task to enforce the pending pings quota.
    *
    * @return {Promise} Resolved when the cleanup task completes.
    */
-  runEnforcePendingPingsQuotaTask: Task.async(function*() {
+  async runEnforcePendingPingsQuotaTask() {
     // If there's a cleaning task already running, return it.
     if (this._enforcePendingPingsQuotaTask) {
       return this._enforcePendingPingsQuotaTask;
@@ -1037,18 +1037,18 @@ var TelemetryStorageImpl = {
     // Since there's no quota enforcing task running, start it.
     try {
       this._enforcePendingPingsQuotaTask = this._enforcePendingPingsQuota();
-      yield this._enforcePendingPingsQuotaTask;
+      await this._enforcePendingPingsQuotaTask;
     } finally {
       this._enforcePendingPingsQuotaTask = null;
     }
     return undefined;
-  }),
+  },
 
   /**
    * Enforce a disk quota for the pending pings.
    * @return {Promise} Resolved when the quota check is complete.
    */
-  _enforcePendingPingsQuota: Task.async(function*() {
+  async _enforcePendingPingsQuota() {
     this._log.trace("_enforcePendingPingsQuota");
     let startTimeStamp = Policy.now().getTime();
 
@@ -1077,7 +1077,7 @@ var TelemetryStorageImpl = {
       let ping = pingList[i];
 
       // Get the size for this ping.
-      const fileSize = yield getPendingPingSize(ping.id);
+      const fileSize = await getPendingPingSize(ping.id);
       if (!fileSize) {
         this._log.warn("_enforcePendingPingsQuota - Unable to find the size of ping " + ping.id);
         continue;
@@ -1125,7 +1125,7 @@ var TelemetryStorageImpl = {
 
       // This list is guaranteed to be in order, so remove the pings at its
       // beginning (oldest).
-      yield this.removePendingPing(ping.id);
+      await this.removePendingPing(ping.id);
     }
 
     const endTimeStamp = Policy.now().getTime();
@@ -1134,7 +1134,7 @@ var TelemetryStorageImpl = {
     // this condition.
     recordHistograms(PENDING_PINGS_SIZE_PROBE_SPECIAL_VALUE, pingsToPurge.length,
                  Math.ceil(endTimeStamp - startTimeStamp));
-  }),
+  },
 
   /**
    * Reset the storage state in tests.
@@ -1154,13 +1154,13 @@ var TelemetryStorageImpl = {
    *
    * @return {promise>}
    */
-  loadArchivedPingList: Task.async(function*() {
+  async loadArchivedPingList() {
     // If there's an archive loading task already running, return it.
     if (this._scanArchiveTask) {
       return this._scanArchiveTask;
     }
 
-    yield waitForAll(this._activelyArchiving);
+    await waitForAll(this._activelyArchiving);
 
     if (this._scannedArchiveDirectory) {
       this._log.trace("loadArchivedPingList - Archive already scanned, hitting cache.");
@@ -1171,14 +1171,14 @@ var TelemetryStorageImpl = {
     let result;
     try {
       this._scanArchiveTask = this._scanArchive();
-      result = yield this._scanArchiveTask;
+      result = await this._scanArchiveTask;
     } finally {
       this._scanArchiveTask = null;
     }
     return result;
-  }),
+  },
 
-  _scanArchive: Task.async(function*() {
+  async _scanArchive() {
     this._log.trace("_scanArchive");
 
     let submitProbes = (pingCount, dirCount) => {
@@ -1188,21 +1188,21 @@ var TelemetryStorageImpl = {
                .add(dirCount);
     };
 
-    if (!(yield OS.File.exists(gPingsArchivePath))) {
+    if (!(await OS.File.exists(gPingsArchivePath))) {
       submitProbes(0, 0);
       return new Map();
     }
 
     let dirIterator = new OS.File.DirectoryIterator(gPingsArchivePath);
     let subdirs =
-      (yield dirIterator.nextBatch()).filter(e => e.isDir).filter(e => isValidArchiveDir(e.name));
+        (await dirIterator.nextBatch()).filter(e => e.isDir).filter(e => isValidArchiveDir(e.name));
     dirIterator.close();
 
     // Walk through the monthly subdirs of the form /
     for (let dir of subdirs) {
       this._log.trace("_scanArchive - checking in subdir: " + dir.path);
       let pingIterator = new OS.File.DirectoryIterator(dir.path);
-      let pings = (yield pingIterator.nextBatch()).filter(e => !e.isDir);
+      let pings = (await pingIterator.nextBatch()).filter(e => !e.isDir);
       pingIterator.close();
 
       // Now process any ping files of the form "...[json|jsonlz4]".
@@ -1222,7 +1222,7 @@ var TelemetryStorageImpl = {
             continue;
           }
 
-          yield this._removeArchivedPing(data.id, data.timestampCreated, data.type)
+          await this._removeArchivedPing(data.id, data.timestampCreated, data.type)
                     .catch((e) => this._log.warn("_scanArchive - failed to remove ping", e));
         }
 
@@ -1238,7 +1238,7 @@ var TelemetryStorageImpl = {
     // Update the ping and directories count histograms.
     submitProbes(this._archivedPings.size, subdirs.length);
     return this._archivedPings;
-  }),
+  },
 
   /**
    * Save a single ping to a file.
@@ -1252,7 +1252,7 @@ var TelemetryStorageImpl = {
    * compression will be used.
    * @returns {promise}
    */
-  savePingToFile: Task.async(function*(ping, filePath, overwrite, compress = false) {
+  async savePingToFile(ping, filePath, overwrite, compress = false) {
     try {
       this._log.trace("savePingToFile - path: " + filePath);
       let pingString = JSON.stringify(ping);
@@ -1260,13 +1260,13 @@ var TelemetryStorageImpl = {
       if (compress) {
         options.compression = "lz4";
       }
-      yield OS.File.writeAtomic(filePath, pingString, options);
+      await OS.File.writeAtomic(filePath, pingString, options);
     } catch (e) {
       if (!e.becauseExists) {
         throw e;
       }
     }
-  }),
+  },
 
   /**
    * Save a ping to its file.
@@ -1276,12 +1276,12 @@ var TelemetryStorageImpl = {
    * if it exists.
    * @returns {promise}
    */
-  savePing: Task.async(function*(ping, overwrite) {
-    yield getPingDirectory();
+  async savePing(ping, overwrite) {
+    await getPingDirectory();
     let file = pingFilePath(ping);
-    yield this.savePingToFile(ping, file, overwrite);
+    await this.savePingToFile(ping, file, overwrite);
     return file;
-  }),
+  },
 
   /**
    * Add a ping to the saved pings directory so that it gets saved
@@ -1317,7 +1317,7 @@ var TelemetryStorageImpl = {
     return p;
   },
 
-  loadPendingPing: Task.async(function*(id) {
+  async loadPendingPing(id) {
     this._log.trace("loadPendingPing - id: " + id);
     let info = this._pendingPings.get(id);
     if (!info) {
@@ -1328,7 +1328,7 @@ var TelemetryStorageImpl = {
     // Try to get the dimension of the ping. If that fails, update the histograms.
     let fileSize = 0;
     try {
-      fileSize = (yield OS.File.stat(info.path)).size;
+      fileSize = (await OS.File.stat(info.path)).size;
     } catch (e) {
       if (!(e instanceof OS.File.Error) || !e.becauseNoSuchFile) {
         throw e;
@@ -1338,7 +1338,7 @@ var TelemetryStorageImpl = {
 
     // Purge pings which are too big.
     if (fileSize > PING_FILE_MAXIMUM_SIZE_BYTES) {
-      yield this.removePendingPing(id);
+      await this.removePendingPing(id);
       Telemetry.getHistogramById("TELEMETRY_DISCARDED_PENDING_PINGS_SIZE_MB")
                .add(Math.floor(fileSize / 1024 / 1024));
       Telemetry.getHistogramById("TELEMETRY_PING_SIZE_EXCEEDED_PENDING").add();
@@ -1348,7 +1348,7 @@ var TelemetryStorageImpl = {
     // Try to load the ping file. Update the related histograms on failure.
     let ping;
     try {
-      ping = yield this.loadPingFile(info.path, false);
+      ping = await this.loadPingFile(info.path, false);
     } catch (e) {
       // If we failed to load the ping, check what happened and update the histogram.
       if (e instanceof PingReadError) {
@@ -1363,7 +1363,7 @@ var TelemetryStorageImpl = {
     }
 
     return ping;
-  }),
+  },
 
   removePendingPing(id) {
     let info = this._pendingPings.get(id);
@@ -1407,7 +1407,7 @@ var TelemetryStorageImpl = {
    *
    * @return {Promise} Resolved when the pings are removed.
    */
-  runRemovePendingPingsTask: Task.async(function*() {
+  async runRemovePendingPingsTask() {
     // If we already have a pending pings removal task active, return that.
     if (this._removePendingPingsTask) {
       return this._removePendingPingsTask;
@@ -1416,18 +1416,18 @@ var TelemetryStorageImpl = {
     // Start the task to remove all pending pings. Also make sure to clear the task once done.
     try {
       this._removePendingPingsTask = this.removePendingPings();
-      yield this._removePendingPingsTask;
+      await this._removePendingPingsTask;
     } finally {
       this._removePendingPingsTask = null;
     }
     return undefined;
-  }),
+  },
 
-  removePendingPings: Task.async(function*() {
+  async removePendingPings() {
     this._log.trace("removePendingPings - removing all pending pings");
 
     // Wait on pending pings still being saved, so so we don't miss removing them.
-    yield this.promisePendingPingSaves();
+    await this.promisePendingPingSaves();
 
     // Individually remove existing pings, so we don't interfere with operations expecting
     // the pending pings directory to exist.
@@ -1435,24 +1435,24 @@ var TelemetryStorageImpl = {
     let iter = new OS.File.DirectoryIterator(directory);
 
     try {
-      if (!(yield iter.exists())) {
+      if (!(await iter.exists())) {
         this._log.trace("removePendingPings - the pending pings directory doesn't exist");
         return;
       }
 
-      let files = (yield iter.nextBatch()).filter(e => !e.isDir);
+      let files = (await iter.nextBatch()).filter(e => !e.isDir);
       for (let file of files) {
         try {
-          yield OS.File.remove(file.path);
+          await OS.File.remove(file.path);
         } catch (ex) {
           this._log.error("removePendingPings - failed to remove file " + file.path, ex);
           continue;
         }
       }
     } finally {
-      yield iter.close();
+      await iter.close();
     }
-  }),
+  },
 
   loadPendingPingList() {
     // If we already have a pending scanning task active, return that.
@@ -1481,19 +1481,19 @@ var TelemetryStorageImpl = {
     return this._buildPingList();
   },
 
-  _scanPendingPings: Task.async(function*() {
+  async _scanPendingPings() {
     this._log.trace("_scanPendingPings");
 
     let directory = TelemetryStorage.pingDirectoryPath;
     let iter = new OS.File.DirectoryIterator(directory);
-    let exists = yield iter.exists();
+    let exists = await iter.exists();
 
     try {
       if (!exists) {
         return [];
       }
 
-      let files = (yield iter.nextBatch()).filter(e => !e.isDir);
+      let files = (await iter.nextBatch()).filter(e => !e.isDir);
 
       for (let file of files) {
         if (this._shutdown) {
@@ -1502,7 +1502,7 @@ var TelemetryStorageImpl = {
 
         let info;
         try {
-          info = yield OS.File.stat(file.path);
+          info = await OS.File.stat(file.path);
         } catch (ex) {
           this._log.error("_scanPendingPings - failed to stat file " + file.path, ex);
           continue;
@@ -1512,7 +1512,7 @@ var TelemetryStorageImpl = {
         if (info.size > PING_FILE_MAXIMUM_SIZE_BYTES) {
           this._log.error("_scanPendingPings - removing file exceeding size limit " + file.path);
           try {
-            yield OS.File.remove(file.path);
+            await OS.File.remove(file.path);
           } catch (ex) {
             this._log.error("_scanPendingPings - failed to remove file " + file.path, ex);
           } finally {
@@ -1535,11 +1535,11 @@ var TelemetryStorageImpl = {
         });
       }
     } finally {
-      yield iter.close();
+      await iter.close();
     }
 
     // Explicitly load the deletion ping from its known path, if it's there.
-    if (yield OS.File.exists(gDeletionPingFilePath)) {
+    if (await OS.File.exists(gDeletionPingFilePath)) {
       this._log.trace("_scanPendingPings - Adding pending deletion ping.");
       // We can't get the ping id or the last modification date without hitting the disk.
       // Since deletion has a special handling, we don't really need those.
@@ -1551,7 +1551,7 @@ var TelemetryStorageImpl = {
 
     this._scannedPendingDirectory = true;
     return this._buildPingList();
-  }),
+  },
 
   _buildPingList() {
     const list = Array.from(this._pendingPings, p => ({
@@ -1576,7 +1576,7 @@ var TelemetryStorageImpl = {
    * @throws {PingReadError} There was an error while reading the ping file from the disk.
    * @throws {PingParseError} There was an error while parsing the JSON content of the ping file.
    */
-  loadPingFile: Task.async(function* (aFilePath, aCompressed = false) {
+  async loadPingFile(aFilePath, aCompressed = false) {
     let options = {};
     if (aCompressed) {
       options.compression = "lz4";
@@ -1584,7 +1584,7 @@ var TelemetryStorageImpl = {
 
     let array;
     try {
-      array = yield OS.File.read(aFilePath, options);
+      array = await OS.File.read(aFilePath, options);
     } catch (e) {
       this._log.trace("loadPingfile - unreadable ping " + aFilePath, e);
       throw new PingReadError(e.message, e.becauseNoSuchFile);
@@ -1597,14 +1597,14 @@ var TelemetryStorageImpl = {
       ping = JSON.parse(string);
     } catch (e) {
       this._log.trace("loadPingfile - unparseable ping " + aFilePath, e);
-      yield OS.File.remove(aFilePath).catch((ex) => {
+      await OS.File.remove(aFilePath).catch((ex) => {
         this._log.error("loadPingFile - failed removing unparseable ping file", ex);
       });
       throw new PingParseError(e.message);
     }
 
     return ping;
-  }),
+  },
 
   /**
    * Archived pings are saved with file names of the form:
@@ -1659,18 +1659,18 @@ var TelemetryStorageImpl = {
     };
   },
 
-  saveAbortedSessionPing: Task.async(function*(ping) {
+  async saveAbortedSessionPing(ping) {
     this._log.trace("saveAbortedSessionPing - ping path: " + gAbortedSessionFilePath);
-    yield OS.File.makeDir(gDataReportingDir, { ignoreExisting: true });
+    await OS.File.makeDir(gDataReportingDir, { ignoreExisting: true });
 
     return this._abortedSessionSerializer.enqueueTask(() =>
       this.savePingToFile(ping, gAbortedSessionFilePath, true));
-  }),
+  },
 
-  loadAbortedSessionPing: Task.async(function*() {
+  async loadAbortedSessionPing() {
     let ping = null;
     try {
-      ping = yield this.loadPingFile(gAbortedSessionFilePath);
+      ping = await this.loadPingFile(gAbortedSessionFilePath);
     } catch (ex) {
       if (ex.becauseNoSuchFile) {
         this._log.trace("loadAbortedSessionPing - no such file");
@@ -1679,12 +1679,12 @@ var TelemetryStorageImpl = {
       }
     }
     return ping;
-  }),
+  },
 
   removeAbortedSessionPing() {
-    return this._abortedSessionSerializer.enqueueTask(Task.async(function*() {
+    return this._abortedSessionSerializer.enqueueTask(async function() {
       try {
-        yield OS.File.remove(gAbortedSessionFilePath, { ignoreAbsent: false });
+        await OS.File.remove(gAbortedSessionFilePath, { ignoreAbsent: false });
         this._log.trace("removeAbortedSessionPing - success");
       } catch (ex) {
         if (ex.becauseNoSuchFile) {
@@ -1693,7 +1693,7 @@ var TelemetryStorageImpl = {
           this._log.error("removeAbortedSessionPing - error removing ping", ex)
         }
       }
-    }.bind(this)));
+    }.bind(this));
   },
 
   /**
@@ -1701,24 +1701,24 @@ var TelemetryStorageImpl = {
    * @param ping The deletion ping.
    * @return {Promise} Resolved when the ping is saved.
    */
-  saveDeletionPing: Task.async(function*(ping) {
+  async saveDeletionPing(ping) {
     this._log.trace("saveDeletionPing - ping path: " + gDeletionPingFilePath);
-    yield OS.File.makeDir(gDataReportingDir, { ignoreExisting: true });
+    await OS.File.makeDir(gDataReportingDir, { ignoreExisting: true });
 
     let p = this._deletionPingSerializer.enqueueTask(() =>
       this.savePingToFile(ping, gDeletionPingFilePath, true));
     this._trackPendingPingSaveTask(p);
     return p;
-  }),
+  },
 
   /**
    * Remove the deletion ping.
    * @return {Promise} Resolved when the ping is deleted from the disk.
    */
-  removeDeletionPing: Task.async(function*() {
-    return this._deletionPingSerializer.enqueueTask(Task.async(function*() {
+  async removeDeletionPing() {
+    return this._deletionPingSerializer.enqueueTask(async function() {
       try {
-        yield OS.File.remove(gDeletionPingFilePath, { ignoreAbsent: false });
+        await OS.File.remove(gDeletionPingFilePath, { ignoreAbsent: false });
         this._log.trace("removeDeletionPing - success");
       } catch (ex) {
         if (ex.becauseNoSuchFile) {
@@ -1727,8 +1727,8 @@ var TelemetryStorageImpl = {
           this._log.error("removeDeletionPing - error removing ping", ex)
         }
       }
-    }.bind(this)));
-  }),
+    }.bind(this));
+  },
 
   isDeletionPing(aPingId) {
     let pingInfo = this._pendingPings.get(aPingId);
@@ -1748,7 +1748,7 @@ var TelemetryStorageImpl = {
    * the future.
    * @return {Promise} Resolved when the database files are deleted.
    */
-  removeFHRDatabase: Task.async(function*() {
+  async removeFHRDatabase() {
     this._log.trace("removeFHRDatabase");
 
     // Let's try to remove the FHR DB with the default filename first.
@@ -1774,10 +1774,10 @@ var TelemetryStorageImpl = {
     }
 
     for (let f of FILES_TO_REMOVE) {
-      yield OS.File.remove(f, {ignoreAbsent: true})
+      await OS.File.remove(f, {ignoreAbsent: true})
                    .catch(e => this._log.error("removeFHRDatabase - failed to remove " + f, e));
     }
-  }),
+  },
 };
 
 // Utility functions
@@ -1789,15 +1789,15 @@ function pingFilePath(ping) {
 }
 
 function getPingDirectory() {
-  return Task.spawn(function*() {
+  return (async function() {
     let directory = TelemetryStorage.pingDirectoryPath;
 
-    if (!(yield OS.File.exists(directory))) {
-      yield OS.File.makeDir(directory, { unixMode: OS.Constants.S_IRWXU });
+    if (!(await OS.File.exists(directory))) {
+      await OS.File.makeDir(directory, { unixMode: OS.Constants.S_IRWXU });
     }
 
     return directory;
-  });
+  })();
 }
 
 /**
@@ -1822,33 +1822,33 @@ function getArchivedPingPath(aPingId, aDate, aType) {
  * Get the size of the ping file on the disk.
  * @return {Integer} The file size, in bytes, of the ping file or 0 on errors.
  */
-var getArchivedPingSize = Task.async(function*(aPingId, aDate, aType) {
+var getArchivedPingSize = async function(aPingId, aDate, aType) {
   const path = getArchivedPingPath(aPingId, aDate, aType);
   let filePaths = [ path + "lz4", path ];
 
   for (let path of filePaths) {
     try {
-      return (yield OS.File.stat(path)).size;
+      return (await OS.File.stat(path)).size;
     } catch (e) {}
   }
 
   // That's odd, this ping doesn't seem to exist.
   return 0;
-});
+};
 
 /**
  * Get the size of the pending ping file on the disk.
  * @return {Integer} The file size, in bytes, of the ping file or 0 on errors.
  */
-var getPendingPingSize = Task.async(function*(aPingId) {
+var getPendingPingSize = async function(aPingId) {
   const path = OS.Path.join(TelemetryStorage.pingDirectoryPath, aPingId)
   try {
-    return (yield OS.File.stat(path)).size;
+    return (await OS.File.stat(path)).size;
   } catch (e) {}
 
   // That's odd, this ping doesn't seem to exist.
   return 0;
-});
+};
 
 /**
  * Check if a directory name is in the "YYYY-MM" format.

From c45e12d589e21f707f8cf0c268bd162fe9c4e906 Mon Sep 17 00:00:00 2001
From: Patrick Brosset 
Date: Wed, 22 Mar 2017 13:55:54 +0100
Subject: [PATCH 053/300] Bug 1349256 - Rephrase README.md a bit and remove dup
 information; r=sole

MozReview-Commit-ID: DZNKpJarEY7
---
 devtools/docs/README.md | 40 ++++------------------------------------
 1 file changed, 4 insertions(+), 36 deletions(-)

diff --git a/devtools/docs/README.md b/devtools/docs/README.md
index e2a3b8e9e9bb1..392f2a422cf6c 100644
--- a/devtools/docs/README.md
+++ b/devtools/docs/README.md
@@ -1,41 +1,9 @@
 # Firefox Developer Tools
 
-Hello! This documentation is for developers who want to work on the
-developer tools. If you are looking for general docs about how to use
-the tools, checkout [this MDN
-page](https://developer.mozilla.org/en-US/docs/Tools).
+Hello! This documentation is for developers who want to work on the developer tools.
 
-These docs explain how the developer tools work at high-level, as well
-as providing links to reference documentation. This is a good starting
-point if you are a new contributor, or want to learn how our protocol,
-a specific tool, or something else works.
+If you are looking for general docs about how to use the tools, checkout [this MDN page](https://developer.mozilla.org/en-US/docs/Tools) instead.
 
-If you are looking to **start hacking** on the developer tools, all of
-this information is documented on the
-[Hacking](https://wiki.mozilla.org/DevTools/Hacking) wiki page.
+If you are looking for a getting started guide on the developer tools, all of this information is documented on the [Hacking](https://wiki.mozilla.org/DevTools/Hacking) wiki page.
 
-A very quick version:
-
-```
-$ hg clone https://hg.mozilla.org/integration/mozilla-inbound
-$ ./mach build
-$ ./mach run -P development
-```
-
-You can also clone via git from
-`https://github.com/mozilla/gecko-dev.git`. Note that the workflow for
-submitting patches may be a little different if using git.
-
-Please see the [Hacking](https://wiki.mozilla.org/DevTools/Hacking)
-page for a lot more information!
-
-All of our **coding standards** are documented on the [Coding
-Standards](https://wiki.mozilla.org/DevTools/CodingStandards) wiki
-page.
-
-We use ESLint to enforce coding standards, and if you can run it
-straight from the command like this:
-
-```
-./mach eslint path/to/directory
-```
+Head over to the [table of contents](SUMMARY.md) to browse the documentation.
\ No newline at end of file

From a6b82b7df55a262a455dd87752418aac180ea7c6 Mon Sep 17 00:00:00 2001
From: Patrick Brosset 
Date: Wed, 22 Mar 2017 15:49:14 +0100
Subject: [PATCH 054/300] Bug 1349256 - Moved docs into folders so it's easier
 to browse; r=sole

MozReview-Commit-ID: HzL3w8vp8iS
---
 devtools/docs/SUMMARY.md                      |  39 ++++++++---------
 devtools/docs/{ => backend}/backend.md        |   0
 .../{ => backend}/backward-compatibility.md   |   0
 devtools/docs/{ => backend}/debugger-api.md   |   0
 devtools/docs/{ => backend}/protocol.md       |   0
 devtools/docs/{ => frontend}/frontend.md      |   0
 .../docs/{ => frontend}/react-guidelines.md   |   0
 devtools/docs/{ => frontend}/react-tips.md    |   0
 devtools/docs/{ => frontend}/react.md         |   0
 .../docs/{ => frontend}/redux-guidelines.md   |   0
 devtools/docs/{ => frontend}/redux-tips.md    |   0
 devtools/docs/{ => frontend}/redux.md         |   0
 devtools/docs/{ => frontend}/svgs.md          |   6 +--
 .../box-model-highlighter-screenshot.png      | Bin
 .../{svgs => resources}/expand-strokes.gif    | Bin
 .../docs/{svgs => resources}/pathfinder.gif   | Bin
 .../{svgs => resources}/sketch-position.png   | Bin
 devtools/docs/{ => tools}/debugger-panel.md   |   0
 devtools/docs/{ => tools}/highlighters.md     |   2 +-
 devtools/docs/{ => tools}/http-inspector.md   |   0
 devtools/docs/{ => tools}/inspector-panel.md  |   0
 devtools/docs/{ => tools}/inspector.md        |   0
 devtools/docs/{ => tools}/memory-panel.md     |   0
 .../{ => tools}/responsive-design-mode.md     |   0
 devtools/docs/{ => tools}/tools.md            |   0
 devtools/moz.build                            |  40 +++++++++---------
 26 files changed, 44 insertions(+), 43 deletions(-)
 rename devtools/docs/{ => backend}/backend.md (100%)
 rename devtools/docs/{ => backend}/backward-compatibility.md (100%)
 rename devtools/docs/{ => backend}/debugger-api.md (100%)
 rename devtools/docs/{ => backend}/protocol.md (100%)
 rename devtools/docs/{ => frontend}/frontend.md (100%)
 rename devtools/docs/{ => frontend}/react-guidelines.md (100%)
 rename devtools/docs/{ => frontend}/react-tips.md (100%)
 rename devtools/docs/{ => frontend}/react.md (100%)
 rename devtools/docs/{ => frontend}/redux-guidelines.md (100%)
 rename devtools/docs/{ => frontend}/redux-tips.md (100%)
 rename devtools/docs/{ => frontend}/redux.md (100%)
 rename devtools/docs/{ => frontend}/svgs.md (92%)
 rename devtools/docs/{img => resources}/box-model-highlighter-screenshot.png (100%)
 rename devtools/docs/{svgs => resources}/expand-strokes.gif (100%)
 rename devtools/docs/{svgs => resources}/pathfinder.gif (100%)
 rename devtools/docs/{svgs => resources}/sketch-position.png (100%)
 rename devtools/docs/{ => tools}/debugger-panel.md (100%)
 rename devtools/docs/{ => tools}/highlighters.md (99%)
 rename devtools/docs/{ => tools}/http-inspector.md (100%)
 rename devtools/docs/{ => tools}/inspector-panel.md (100%)
 rename devtools/docs/{ => tools}/inspector.md (100%)
 rename devtools/docs/{ => tools}/memory-panel.md (100%)
 rename devtools/docs/{ => tools}/responsive-design-mode.md (100%)
 rename devtools/docs/{ => tools}/tools.md (100%)

diff --git a/devtools/docs/SUMMARY.md b/devtools/docs/SUMMARY.md
index f6b8c2e29a9cc..435b8d21c8855 100644
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -1,22 +1,23 @@
 
 # Summary
 
-* [Tool Architectures](tools.md)
-  * [Inspector](inspector.md)
-    * [Panel Architecture](inspector-panel.md)
-    * [Highlighters](highlighters.md)
-  * [Memory](memory-panel.md)
-  * [Debugger](debugger-panel.md)
-  * [Responsive Design Mode](responsive-design-mode.md)
-* [Frontend](frontend.md)
-  * [Panel SVGs](svgs.md)
-  * [React](react.md)
-    * [Guidelines](react-guidelines.md)
-    * [Tips](react-tips.md)
-  * [Redux](redux.md)
-    * [Guidelines](redux-guidelines.md)
-    * [Tips](redux-tips.md)
-* [Backend](backend.md)
-  * [Protocol](protocol.md)
-  * [Debugger API](debugger-api.md)
-  * [Backward Compatibility](backward-compatibility.md)
+* [Tool Architectures](tools/tools.md)
+  * [Inspector](tools/inspector.md)
+    * [Panel Architecture](tools/inspector-panel.md)
+    * [Highlighters](tools/highlighters.md)
+  * [Memory](tools/memory-panel.md)
+  * [Debugger](tools/debugger-panel.md)
+  * [Responsive Design Mode](tools/responsive-design-mode.md)
+  * [HTTP Inspector](tools/http-inspector.md)
+* [Frontend](frontend/frontend.md)
+  * [Panel SVGs](frontend/svgs.md)
+  * [React](frontend/react.md)
+    * [Guidelines](frontend/react-guidelines.md)
+    * [Tips](frontend/react-tips.md)
+  * [Redux](frontend/redux.md)
+    * [Guidelines](frontend/redux-guidelines.md)
+    * [Tips](frontend/redux-tips.md)
+* [Backend](backend/backend.md)
+  * [Protocol](backend/protocol.md)
+  * [Debugger API](backend/debugger-api.md)
+  * [Backward Compatibility](backend/backward-compatibility.md)
diff --git a/devtools/docs/backend.md b/devtools/docs/backend/backend.md
similarity index 100%
rename from devtools/docs/backend.md
rename to devtools/docs/backend/backend.md
diff --git a/devtools/docs/backward-compatibility.md b/devtools/docs/backend/backward-compatibility.md
similarity index 100%
rename from devtools/docs/backward-compatibility.md
rename to devtools/docs/backend/backward-compatibility.md
diff --git a/devtools/docs/debugger-api.md b/devtools/docs/backend/debugger-api.md
similarity index 100%
rename from devtools/docs/debugger-api.md
rename to devtools/docs/backend/debugger-api.md
diff --git a/devtools/docs/protocol.md b/devtools/docs/backend/protocol.md
similarity index 100%
rename from devtools/docs/protocol.md
rename to devtools/docs/backend/protocol.md
diff --git a/devtools/docs/frontend.md b/devtools/docs/frontend/frontend.md
similarity index 100%
rename from devtools/docs/frontend.md
rename to devtools/docs/frontend/frontend.md
diff --git a/devtools/docs/react-guidelines.md b/devtools/docs/frontend/react-guidelines.md
similarity index 100%
rename from devtools/docs/react-guidelines.md
rename to devtools/docs/frontend/react-guidelines.md
diff --git a/devtools/docs/react-tips.md b/devtools/docs/frontend/react-tips.md
similarity index 100%
rename from devtools/docs/react-tips.md
rename to devtools/docs/frontend/react-tips.md
diff --git a/devtools/docs/react.md b/devtools/docs/frontend/react.md
similarity index 100%
rename from devtools/docs/react.md
rename to devtools/docs/frontend/react.md
diff --git a/devtools/docs/redux-guidelines.md b/devtools/docs/frontend/redux-guidelines.md
similarity index 100%
rename from devtools/docs/redux-guidelines.md
rename to devtools/docs/frontend/redux-guidelines.md
diff --git a/devtools/docs/redux-tips.md b/devtools/docs/frontend/redux-tips.md
similarity index 100%
rename from devtools/docs/redux-tips.md
rename to devtools/docs/frontend/redux-tips.md
diff --git a/devtools/docs/redux.md b/devtools/docs/frontend/redux.md
similarity index 100%
rename from devtools/docs/redux.md
rename to devtools/docs/frontend/redux.md
diff --git a/devtools/docs/svgs.md b/devtools/docs/frontend/svgs.md
similarity index 92%
rename from devtools/docs/svgs.md
rename to devtools/docs/frontend/svgs.md
index 90ff0ff5e9852..65603126df51b 100644
--- a/devtools/docs/svgs.md
+++ b/devtools/docs/frontend/svgs.md
@@ -24,10 +24,10 @@ You can download a sample Illustrator file [here](https://www.dropbox.com/home/M
 When you're designing your icons in a graphics editor like Adobe Illustrator, there are a lot of things you can do that will bring down the size of the file and make your SVGs easier for the developers to work with. Here are some of them:
 
 - **Expand paths**: Instead of having multiple shapes overlapping each other, expand shapes using the pathfinder.
-![Use pathfinder to expand shapes](./svgs/pathfinder.gif)
+![Use pathfinder to expand shapes](../resources/pathfinder.gif)
 - Simplify paths (```Object``` > ```Path``` > ```Simplify```)
 - Expand objects so that strokes become objects. This has the added benefit of keeping the stroke size intact as the SVG is resized.
-![Expand strokes to make them objects](./svgs/expand-strokes.gif)
+![Expand strokes to make them objects](../resources/expand-strokes.gif)
 
 ## Sketch
 Sketch vector work is a little different but the fundamentals (keeping your SVG small, expanding all paths) is the same. Here's what we've found helps to build clean icons:
@@ -35,7 +35,7 @@ Sketch vector work is a little different but the fundamentals (keeping your SVG
 - **Build your icon at 16x16 with the Pixel Grid turned on.** You can turn the pixel grid on at ```View > Canvas > Show Pixels```
 
 - **Make sure that all x/y coordinates are full pixels for lines/rectangles.** Sub-pixels = not on pixel grid.
-![Position in the upper right hand corner of Sketch](./svgs/sketch-position.png)
+![Position in the upper right hand corner of Sketch](../resources/sketch-position.png)
 
 - **Expand all your paths so strokes expand properly as the SVG gets resized.** You can do this at ```Layer > Paths > Vectorize Stroke```.
 
diff --git a/devtools/docs/img/box-model-highlighter-screenshot.png b/devtools/docs/resources/box-model-highlighter-screenshot.png
similarity index 100%
rename from devtools/docs/img/box-model-highlighter-screenshot.png
rename to devtools/docs/resources/box-model-highlighter-screenshot.png
diff --git a/devtools/docs/svgs/expand-strokes.gif b/devtools/docs/resources/expand-strokes.gif
similarity index 100%
rename from devtools/docs/svgs/expand-strokes.gif
rename to devtools/docs/resources/expand-strokes.gif
diff --git a/devtools/docs/svgs/pathfinder.gif b/devtools/docs/resources/pathfinder.gif
similarity index 100%
rename from devtools/docs/svgs/pathfinder.gif
rename to devtools/docs/resources/pathfinder.gif
diff --git a/devtools/docs/svgs/sketch-position.png b/devtools/docs/resources/sketch-position.png
similarity index 100%
rename from devtools/docs/svgs/sketch-position.png
rename to devtools/docs/resources/sketch-position.png
diff --git a/devtools/docs/debugger-panel.md b/devtools/docs/tools/debugger-panel.md
similarity index 100%
rename from devtools/docs/debugger-panel.md
rename to devtools/docs/tools/debugger-panel.md
diff --git a/devtools/docs/highlighters.md b/devtools/docs/tools/highlighters.md
similarity index 99%
rename from devtools/docs/highlighters.md
rename to devtools/docs/tools/highlighters.md
index d9854b516d531..758a66d1f093a 100644
--- a/devtools/docs/highlighters.md
+++ b/devtools/docs/tools/highlighters.md
@@ -6,7 +6,7 @@ By highlighter, we mean anything that DevTools displays on top of the content pa
 
 The most obvious form of highlighter is the box-model highlighter, whose job is to display the 4 box-model regions on top of a given element in the content page, as illustrated in the following screen capture:
 
-![Box-model highlighter](./img/box-model-highlighter-screenshot.png)
+![Box-model highlighter](../resources/box-model-highlighter-screenshot.png)
 
 But there can be a wide variety of highlighters. In particular, highlighters are a pretty good way to give detailed information about:
 
diff --git a/devtools/docs/http-inspector.md b/devtools/docs/tools/http-inspector.md
similarity index 100%
rename from devtools/docs/http-inspector.md
rename to devtools/docs/tools/http-inspector.md
diff --git a/devtools/docs/inspector-panel.md b/devtools/docs/tools/inspector-panel.md
similarity index 100%
rename from devtools/docs/inspector-panel.md
rename to devtools/docs/tools/inspector-panel.md
diff --git a/devtools/docs/inspector.md b/devtools/docs/tools/inspector.md
similarity index 100%
rename from devtools/docs/inspector.md
rename to devtools/docs/tools/inspector.md
diff --git a/devtools/docs/memory-panel.md b/devtools/docs/tools/memory-panel.md
similarity index 100%
rename from devtools/docs/memory-panel.md
rename to devtools/docs/tools/memory-panel.md
diff --git a/devtools/docs/responsive-design-mode.md b/devtools/docs/tools/responsive-design-mode.md
similarity index 100%
rename from devtools/docs/responsive-design-mode.md
rename to devtools/docs/tools/responsive-design-mode.md
diff --git a/devtools/docs/tools.md b/devtools/docs/tools/tools.md
similarity index 100%
rename from devtools/docs/tools.md
rename to devtools/docs/tools/tools.md
diff --git a/devtools/moz.build b/devtools/moz.build
index f6bd80663e709..397e5d2fada63 100644
--- a/devtools/moz.build
+++ b/devtools/moz.build
@@ -24,23 +24,23 @@ if CONFIG['MOZ_BUILD_APP'] in ('browser', 'b2g/dev'):
     DIST_SUBDIR = 'browser'
     export('DIST_SUBDIR')
 
-with Files('**'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools')
-
-with Files('docs/**'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools')
-
-with Files('docs/memory-panel.md'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Memory')
-
-with Files('docs/debugger-panel.md'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Debugger')
-
-with Files('docs/debugger-api.md'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Debugger')
-
-with Files('docs/http-inspector.md'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Console')
-
-with Files('docs/inspector-panel.md'):
-    BUG_COMPONENT = ('Firefox', 'Developer Tools: Inspector')
+with Files('**'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools')
+
+with Files('docs/**'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools')
+
+with Files('docs/tools/memory-panel.md'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Memory')
+
+with Files('docs/tools/debugger-panel.md'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Debugger')
+
+with Files('docs/backend/debugger-api.md'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Debugger')
+
+with Files('docs/tools/http-inspector.md'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Console')
+
+with Files('docs/tools/inspector-panel.md'):
+    BUG_COMPONENT = ('Firefox', 'Developer Tools: Inspector')

From 01bb23c7b6ebf9e445a153c51be59ace40fa61f3 Mon Sep 17 00:00:00 2001
From: Patrick Brosset 
Date: Tue, 21 Mar 2017 15:19:20 +0100
Subject: [PATCH 055/300] Bug 1349256 - Added docs about how to generate the
 gitbook; r=sole

MozReview-Commit-ID: 9pa0rXaLehZ
---
 devtools/docs/README.md | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/devtools/docs/README.md b/devtools/docs/README.md
index 392f2a422cf6c..77bd61c7a6d96 100644
--- a/devtools/docs/README.md
+++ b/devtools/docs/README.md
@@ -6,4 +6,19 @@ If you are looking for general docs about how to use the tools, checkout [this M
 
 If you are looking for a getting started guide on the developer tools, all of this information is documented on the [Hacking](https://wiki.mozilla.org/DevTools/Hacking) wiki page.
 
-Head over to the [table of contents](SUMMARY.md) to browse the documentation.
\ No newline at end of file
+[GitBook](https://github.com/GitbookIO/gitbook) is used to generate online documentation from the markdown files here.
+Here is how you can re-generate the book:
+
+```bash
+# Install GitBook locally
+npm install -g gitbook-cli
+
+# Go into the docs directory
+cd /path/to/mozilla-central/devtools/docs/
+
+# Generate the docs and start a local server
+gitbook serve
+
+# Or just built the book
+gitbook build
+```
\ No newline at end of file

From d69891a784e0d82a6a39722c34beb8d419613ff5 Mon Sep 17 00:00:00 2001
From: Patrick Brosset 
Date: Tue, 21 Mar 2017 15:22:30 +0100
Subject: [PATCH 056/300] Bug 1349256 - Added a link to the debugger.html
 documentation; r=sole

MozReview-Commit-ID: 2D8uitbYLze
---
 devtools/docs/tools/debugger-panel.md | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/devtools/docs/tools/debugger-panel.md b/devtools/docs/tools/debugger-panel.md
index 1cb97dadc20b0..19d769eee83b9 100644
--- a/devtools/docs/tools/debugger-panel.md
+++ b/devtools/docs/tools/debugger-panel.md
@@ -1,2 +1 @@
-
-This is just a stub until we write debugger docs.
\ No newline at end of file
+You can find the debugger documentation on [the debugger.html GitHub repository](https://devtools-html.github.io/debugger.html/).
\ No newline at end of file

From 80ff1d1c24dcee49d80b39e3f5a3bab4b2b33357 Mon Sep 17 00:00:00 2001
From: Patrick Brosset 
Date: Tue, 21 Mar 2017 17:36:34 +0100
Subject: [PATCH 057/300] Bug 1349256 - Merged server and general docs under
 just one directory; r=sole

MozReview-Commit-ID: HzNGfWhYukh
---
 devtools/docs/SUMMARY.md                                   | 7 ++++++-
 .../{server/docs => docs/backend}/actor-e10s-handling.md   | 0
 devtools/{server/docs => docs/backend}/actor-hierarchy.md  | 0
 .../{server/docs => docs/backend}/actor-registration.md    | 0
 devtools/{server/docs => docs/backend}/protocol.js.md      | 0
 5 files changed, 6 insertions(+), 1 deletion(-)
 rename devtools/{server/docs => docs/backend}/actor-e10s-handling.md (100%)
 rename devtools/{server/docs => docs/backend}/actor-hierarchy.md (100%)
 rename devtools/{server/docs => docs/backend}/actor-registration.md (100%)
 rename devtools/{server/docs => docs/backend}/protocol.js.md (100%)

diff --git a/devtools/docs/SUMMARY.md b/devtools/docs/SUMMARY.md
index 435b8d21c8855..e178d96acf293 100644
--- a/devtools/docs/SUMMARY.md
+++ b/devtools/docs/SUMMARY.md
@@ -18,6 +18,11 @@
     * [Guidelines](frontend/redux-guidelines.md)
     * [Tips](frontend/redux-tips.md)
 * [Backend](backend/backend.md)
-  * [Protocol](backend/protocol.md)
+  * [Remote Debugging Protocol](backend/protocol.md)
   * [Debugger API](backend/debugger-api.md)
   * [Backward Compatibility](backend/backward-compatibility.md)
+  * Actors
+    * [Actors Organization](backend/actor-hierarchy.md)
+    * [Handling Multi-Processes in Actors](backend/actor-e10s-handling.md)
+    * [Writing Actors With protocol.js](backend/protocol.js.md)
+    * [Registering A New Actor](backend/actor-registration.md)
diff --git a/devtools/server/docs/actor-e10s-handling.md b/devtools/docs/backend/actor-e10s-handling.md
similarity index 100%
rename from devtools/server/docs/actor-e10s-handling.md
rename to devtools/docs/backend/actor-e10s-handling.md
diff --git a/devtools/server/docs/actor-hierarchy.md b/devtools/docs/backend/actor-hierarchy.md
similarity index 100%
rename from devtools/server/docs/actor-hierarchy.md
rename to devtools/docs/backend/actor-hierarchy.md
diff --git a/devtools/server/docs/actor-registration.md b/devtools/docs/backend/actor-registration.md
similarity index 100%
rename from devtools/server/docs/actor-registration.md
rename to devtools/docs/backend/actor-registration.md
diff --git a/devtools/server/docs/protocol.js.md b/devtools/docs/backend/protocol.js.md
similarity index 100%
rename from devtools/server/docs/protocol.js.md
rename to devtools/docs/backend/protocol.js.md

From 2f56a9767363ba2c3bf6ce16c8a46b6e6b5de1bb Mon Sep 17 00:00:00 2001
From: "Carsten \"Tomcat\" Book" 
Date: Wed, 22 Mar 2017 16:39:55 +0100
Subject: [PATCH 058/300] Backed out changeset d24bb78a585c (bug 1340842)

---
 browser/base/content/tabbrowser.xml          | 6 ------
 toolkit/components/telemetry/Histograms.json | 9 ---------
 2 files changed, 15 deletions(-)

diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml
index c0ae8e07acd29..b910a4f24409a 100644
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -2659,16 +2659,10 @@
               // We need to block while calling permitUnload() because it
               // processes the event queue and may lead to another removeTab()
               // call before permitUnload() returns.
-
-              TelemetryStopwatch.start("FX_TAB_CLOSE_PERMIT_UNLOAD_TIME_MS", aTab);
-
               aTab._pendingPermitUnload = true;
               let {permitUnload, timedOut} = aTab.linkedPanel ?
                   browser.permitUnload() : {permitUnload: true, timedOut: false};
               delete aTab._pendingPermitUnload;
-
-              TelemetryStopwatch.finish("FX_TAB_CLOSE_PERMIT_UNLOAD_TIME_MS", aTab);
-
               // If we were closed during onbeforeunload, we return false now
               // so we don't (try to) close the same tab again. Of course, we
               // also stop if the unload was cancelled by the user:
diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json
index aebf502b1dc77..796cba0ee4309 100644
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -5048,15 +5048,6 @@
     "n_buckets": 50,
     "description": "Firefox: Time taken from the point of closing a tab (without animation) to the browser element being removed from the DOM. (ms)."
   },
-  "FX_TAB_CLOSE_PERMIT_UNLOAD_TIME_MS": {
-    "alert_emails": ["mconley@mozilla.com", "hkirschner@mozilla.com"],
-    "bug_numbers": [1340842],
-    "expires_in_version": "60",
-    "kind": "exponential",
-    "high": 10000,
-    "n_buckets": 50,
-    "description": "Firefox: Time taken to run permitUnload on a browser during tab close to see whether or not we're allowed to close the tab (ms)."
-  },
   "FX_TAB_ANIM_OPEN_PREVIEW_FRAME_INTERVAL_MS": {
     "expires_in_version": "never",
     "kind": "exponential",

From 02c34cbbfdd4e7a276f57dac1db95ec20c096673 Mon Sep 17 00:00:00 2001
From: "Carsten \"Tomcat\" Book" 
Date: Wed, 22 Mar 2017 16:39:59 +0100
Subject: [PATCH 059/300] Backed out changeset 57ae2dd78f79 (bug 1340842)

---
 browser/base/content/test/tabs/browser.ini    |  1 -
 .../test/tabs/browser_tabCloseProbes.js       | 77 -------------------
 2 files changed, 78 deletions(-)
 delete mode 100644 browser/base/content/test/tabs/browser_tabCloseProbes.js

diff --git a/browser/base/content/test/tabs/browser.ini b/browser/base/content/test/tabs/browser.ini
index 524cd8e3adeb9..d764db6d1a516 100644
--- a/browser/base/content/test/tabs/browser.ini
+++ b/browser/base/content/test/tabs/browser.ini
@@ -4,7 +4,6 @@ support-files =
 
 [browser_abandonment_telemetry.js]
 [browser_allow_process_switches_despite_related_browser.js]
-[browser_tabCloseProbes.js]
 [browser_tabSpinnerProbe.js]
 skip-if = !e10s # Tab spinner is e10s only.
 [browser_tabSpinnerTypeProbe.js]
diff --git a/browser/base/content/test/tabs/browser_tabCloseProbes.js b/browser/base/content/test/tabs/browser_tabCloseProbes.js
deleted file mode 100644
index eec1f4171bfe5..0000000000000
--- a/browser/base/content/test/tabs/browser_tabCloseProbes.js
+++ /dev/null
@@ -1,77 +0,0 @@
-"use strict";
-
-var gAnimHistogram = Services.telemetry
-                             .getHistogramById("FX_TAB_CLOSE_TIME_ANIM_MS");
-var gNoAnimHistogram = Services.telemetry
-                               .getHistogramById("FX_TAB_CLOSE_TIME_NO_ANIM_MS");
-
-/**
- * Takes a Telemetry histogram snapshot and makes sure
- * that the sum of all counts equals expectedCount.
- *
- * @param snapshot (Object)
- *        The Telemetry histogram snapshot to examine.
- * @param expectedCount (int)
- *        What we expect the number of incremented counts to be. For example,
- *        If we expect this probe to have only had a single recording, this
- *        would be 1. If we expected it to have not recorded any data at all,
- *        this would be 0.
- */
-function assertCount(snapshot, expectedCount) {
-  // Use Array.prototype.reduce to sum up all of the
-  // snapshot.count entries
-  Assert.equal(snapshot.counts.reduce((a, b) => a + b), expectedCount,
-               `Should only be ${expectedCount} collected value.`);
-}
-
-add_task(function* setup() {
-  // These probes are opt-in, meaning we only capture them if extended
-  // Telemetry recording is enabled.
-  yield SpecialPowers.pushPrefEnv({
-    set: [["toolkit.telemetry.enabled", true]]
-  });
-
-  let oldCanRecord = Services.telemetry.canRecordExtended;
-  Services.telemetry.canRecordExtended = true;
-  registerCleanupFunction(() => {
-    Services.telemetry.canRecordExtended = oldCanRecord;
-  });
-});
-
-/**
- * Tests the FX_TAB_CLOSE_TIME_ANIM_MS probe by closing a tab with the tab
- * close animation.
- */
-add_task(function* test_close_time_anim_probe() {
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser);
-
-  gAnimHistogram.clear();
-  gNoAnimHistogram.clear();
-
-  yield BrowserTestUtils.removeTab(tab, { animate: true });
-
-  assertCount(gAnimHistogram.snapshot(), 1);
-  assertCount(gNoAnimHistogram.snapshot(), 0);
-
-  gAnimHistogram.clear();
-  gNoAnimHistogram.clear();
-});
-
-/**
- * Tests the FX_TAB_CLOSE_TIME_NO_ANIM_MS probe by closing a tab without the
- * tab close animation.
- */
-add_task(function* test_close_time_no_anim_probe() {
-  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser);
-
-  gAnimHistogram.clear();
-  gNoAnimHistogram.clear();
-
-  yield BrowserTestUtils.removeTab(tab, { animate: false });
-
-  assertCount(gAnimHistogram.snapshot(), 0);
-  assertCount(gNoAnimHistogram.snapshot(), 1);
-
-  gAnimHistogram.clear();
-  gNoAnimHistogram.clear();
-});

From 555bf15d929016fb3acfd22ff7971af85f8397e4 Mon Sep 17 00:00:00 2001
From: "Carsten \"Tomcat\" Book" 
Date: Wed, 22 Mar 2017 16:40:02 +0100
Subject: [PATCH 060/300] Backed out changeset b3abd0e89699 (bug 1340842)

---
 .../browser_captivePortal_certErrorUI.js      |  2 +-
 .../content/test/general/browser_bug455852.js |  2 +-
 .../browser_tabs_close_beforeunload.js        |  2 +-
 .../test/tabcrashed/browser_withoutDump.js    |  2 +-
 ...wser_tabMatchesInAwesomebar_perwindowpb.js |  2 +-
 .../BrowserTestUtils/BrowserTestUtils.jsm     | 27 ++++---------------
 6 files changed, 10 insertions(+), 27 deletions(-)

diff --git a/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js b/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js
index a97a28bf3b81b..7b315730426da 100644
--- a/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js
+++ b/browser/base/content/test/captivePortal/browser_captivePortal_certErrorUI.js
@@ -64,7 +64,7 @@ add_task(function* checkCaptivePortalCertErrorUI() {
   let portalTab2 = yield portalTabPromise;
   is(portalTab2, portalTab, "The existing portal tab should be focused.");
 
-  let portalTabRemoved = BrowserTestUtils.tabRemoved(portalTab);
+  let portalTabRemoved = BrowserTestUtils.removeTab(portalTab, {dontRemove: true});
   let errorTabReloaded = BrowserTestUtils.waitForErrorPage(browser);
 
   Services.obs.notifyObservers(null, "captive-portal-login-success", null);
diff --git a/browser/base/content/test/general/browser_bug455852.js b/browser/base/content/test/general/browser_bug455852.js
index 4d1f80aa6c079..ce883b5819f68 100644
--- a/browser/base/content/test/general/browser_bug455852.js
+++ b/browser/base/content/test/general/browser_bug455852.js
@@ -7,7 +7,7 @@ add_task(function*() {
   var tab = gBrowser.selectedTab;
   gPrefService.setBoolPref("browser.tabs.closeWindowWithLastTab", false);
 
-  let tabClosedPromise = BrowserTestUtils.tabRemoved(tab);
+  let tabClosedPromise = BrowserTestUtils.removeTab(tab, {dontRemove: true});
   EventUtils.synthesizeKey("w", { accelKey: true });
   yield tabClosedPromise;
 
diff --git a/browser/base/content/test/general/browser_tabs_close_beforeunload.js b/browser/base/content/test/general/browser_tabs_close_beforeunload.js
index 410061ce33ac2..b867efd7205cf 100644
--- a/browser/base/content/test/general/browser_tabs_close_beforeunload.js
+++ b/browser/base/content/test/general/browser_tabs_close_beforeunload.js
@@ -32,7 +32,7 @@ add_task(function*() {
   yield secondTabLoadedPromise;
 
   let closeBtn = document.getAnonymousElementByAttribute(secondTab, "anonid", "close-button");
-  let closePromise = BrowserTestUtils.tabRemoved(secondTab);
+  let closePromise = BrowserTestUtils.removeTab(secondTab, {dontRemove: true});
   info("closing second tab (which will self-close in beforeunload)");
   closeBtn.click();
   ok(secondTab.closing, "Second tab should be marked as closing synchronously.");
diff --git a/browser/base/content/test/tabcrashed/browser_withoutDump.js b/browser/base/content/test/tabcrashed/browser_withoutDump.js
index d68b76e38e856..d63baa5457a8b 100644
--- a/browser/base/content/test/tabcrashed/browser_withoutDump.js
+++ b/browser/base/content/test/tabcrashed/browser_withoutDump.js
@@ -25,7 +25,7 @@ add_task(function* test_without_dump() {
     let tab = gBrowser.getTabForBrowser(browser);
     yield BrowserTestUtils.crashBrowser(browser);
 
-    let tabRemovedPromise = BrowserTestUtils.tabRemoved(tab);
+    let tabRemovedPromise = BrowserTestUtils.removeTab(tab, { dontRemove: true });
 
     yield ContentTask.spawn(browser, null, function*() {
       let doc = content.document;
diff --git a/browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js b/browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js
index 09a7211ae5985..08a18b38a4ffc 100644
--- a/browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js
+++ b/browser/base/content/test/urlbar/browser_tabMatchesInAwesomebar_perwindowpb.js
@@ -66,7 +66,7 @@ function* runTest(aSourceWindow, aDestWindow, aExpectSwitch, aCallback) {
 
   let awaitTabSwitch;
   if (aExpectSwitch) {
-    awaitTabSwitch = BrowserTestUtils.tabRemoved(testTab)
+    awaitTabSwitch = BrowserTestUtils.removeTab(testTab, {dontRemove: true})
   }
 
   // Execute the selected action.
diff --git a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
index 50c1d50da1368..b471ca3c6d085 100644
--- a/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
+++ b/testing/mochitest/BrowserTestUtils/BrowserTestUtils.jsm
@@ -822,31 +822,10 @@ this.BrowserTestUtils = {
   /**
    * Removes the given tab from its parent tabbrowser and
    * waits until its final message has reached the parent.
-   *
-   * @param (tab) tab
-   *        The tab to remove.
-   * @param (Object) options
-   *        Extra options to pass to tabbrowser's removeTab method.
-   * @returns (Promise)
-   * @resolves When the tab is removed. Does not get passed a value.
    */
   removeTab(tab, options = {}) {
-    let tabRemoved = this.tabRemoved(tab);
-    if (!tab.closing) {
-      tab.ownerGlobal.gBrowser.removeTab(tab, options);
-    }
-    return tabRemoved;
-  },
+    let dontRemove = options && options.dontRemove;
 
-  /**
-   * Returns a Promise that resolves once a tab has been removed.
-   *
-   * @param (tab) tab
-   *        The tab that will be removed.
-   * @returns (Promise)
-   * @resolves When the tab is removed. Does not get passed a value.
-   */
-  tabRemoved(tab) {
     return new Promise(resolve => {
       let {messageManager: mm, frameLoader} = tab.linkedBrowser;
       mm.addMessageListener("SessionStore:update", function onMessage(msg) {
@@ -855,6 +834,10 @@ this.BrowserTestUtils = {
           resolve();
         }
       }, true);
+
+      if (!dontRemove && !tab.closing) {
+        tab.ownerGlobal.gBrowser.removeTab(tab);
+      }
     });
   },
 

From 796c2e571e3bb8c9e3c1e25ab6743c65e46cc833 Mon Sep 17 00:00:00 2001
From: "Carsten \"Tomcat\" Book" 
Date: Wed, 22 Mar 2017 16:40:06 +0100
Subject: [PATCH 061/300] Backed out changeset a983c5ce4bc3 (bug 1340842)

---
 browser/base/content/tabbrowser.xml          | 35 +-------------------
 toolkit/components/telemetry/Histograms.json | 18 ----------
 2 files changed, 1 insertion(+), 52 deletions(-)

diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml
index b910a4f24409a..5335b574d71a9 100644
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -2555,23 +2555,6 @@
         
         
           
diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json
index 796cba0ee4309..023d76f4fb28b 100644
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -5030,24 +5030,6 @@
     "n_buckets": 30,
     "description": "Firefox: Time taken to kick off image compression of the canvas that will be used during swiping through history (ms)."
   },
-  "FX_TAB_CLOSE_TIME_ANIM_MS": {
-    "alert_emails": ["mconley@mozilla.com", "hkirschner@mozilla.com"],
-    "bug_numbers": [1340842],
-    "expires_in_version": "60",
-    "kind": "exponential",
-    "high": 10000,
-    "n_buckets": 50,
-    "description": "Firefox: Time taken from the point of closing a tab (with animation), to the browser element being removed from the DOM. (ms)."
-  },
-  "FX_TAB_CLOSE_TIME_NO_ANIM_MS": {
-    "alert_emails": ["mconley@mozilla.com", "hkirschner@mozilla.com"],
-    "bug_numbers": [1340842],
-    "expires_in_version": "60",
-    "kind": "exponential",
-    "high": 10000,
-    "n_buckets": 50,
-    "description": "Firefox: Time taken from the point of closing a tab (without animation) to the browser element being removed from the DOM. (ms)."
-  },
   "FX_TAB_ANIM_OPEN_PREVIEW_FRAME_INTERVAL_MS": {
     "expires_in_version": "never",
     "kind": "exponential",

From 8824e3742ea9970e013db32435e900ff7f5de670 Mon Sep 17 00:00:00 2001
From: "Carsten \"Tomcat\" Book" 
Date: Wed, 22 Mar 2017 16:40:47 +0100
Subject: [PATCH 062/300] Backed out changeset 6a68273665f6 (bug 1340842) for
 test failures in browser_bookmark_all_tabs.js

---
 .../telemetry/TelemetryStopwatch.jsm          | 47 ++++++-------------
 .../docs/collection/measuring-time.rst        | 13 -----
 2 files changed, 14 insertions(+), 46 deletions(-)

diff --git a/toolkit/components/telemetry/TelemetryStopwatch.jsm b/toolkit/components/telemetry/TelemetryStopwatch.jsm
index 299b70a5d58ec..5bc2a56833915 100644
--- a/toolkit/components/telemetry/TelemetryStopwatch.jsm
+++ b/toolkit/components/telemetry/TelemetryStopwatch.jsm
@@ -168,17 +168,11 @@ this.TelemetryStopwatch = {
    * @param (Object) aObj - Optional parameter which associates the histogram
    *                        timer with the given object.
    *
-   * @param {Boolean} aCanceledOkay - Optional parameter which will suppress any
-   *                                  warnings that normally fire when a stopwatch
-   *                                  is finished after being cancelled. Defaults
-   *                                  to false.
-   *
    * @returns {Integer} time in milliseconds or -1 if the stopwatch was not
    *                   found.
    */
-  timeElapsed(aHistogram, aObj, aCanceledOkay) {
-    return TelemetryStopwatchImpl.timeElapsed(aHistogram, aObj, null,
-                                              aCanceledOkay);
+  timeElapsed(aHistogram, aObj) {
+    return TelemetryStopwatchImpl.timeElapsed(aHistogram, aObj, null);
   },
 
   /**
@@ -191,16 +185,11 @@ this.TelemetryStopwatch = {
    * @param {Object} aObj - Optional parameter which associates the histogram
    *                        timer with the given object.
    *
-   * @param {Boolean} aCanceledOkay - Optional parameter which will suppress any
-   *                                  warnings that normally fire when a stopwatch
-   *                                  is finished after being cancelled. Defaults
-   *                                  to false.
-   *
    * @returns {Boolean} True if the timer was succesfully stopped and the data
    *                    was added to the histogram, False otherwise.
    */
-  finish(aHistogram, aObj, aCanceledOkay) {
-    return TelemetryStopwatchImpl.finish(aHistogram, aObj, null, aCanceledOkay);
+  finish(aHistogram, aObj) {
+    return TelemetryStopwatchImpl.finish(aHistogram, aObj, null);
   },
 
   /**
@@ -262,9 +251,8 @@ this.TelemetryStopwatch = {
    * @return {Integer} time in milliseconds or -1 if the stopwatch was not
    *                   found.
    */
-  timeElapsedKeyed(aHistogram, aKey, aObj, aCanceledOkay) {
-    return TelemetryStopwatchImpl.timeElapsed(aHistogram, aObj, aKey,
-                                              aCanceledOkay);
+  timeElapsedKeyed(aHistogram, aKey, aObj) {
+    return TelemetryStopwatchImpl.timeElapsed(aHistogram, aObj, aKey);
   },
 
   /**
@@ -279,16 +267,11 @@ this.TelemetryStopwatch = {
    * @param {Object} aObj - optional parameter which associates the histogram
    *                        timer with the given object.
    *
-   * @param {Boolean} aCanceledOkay - Optional parameter which will suppress any
-   *                                  warnings that normally fire when a stopwatch
-   *                                  is finished after being cancelled. Defaults
-   *                                  to false.
-   *
    * @returns {Boolean} True if the timer was succesfully stopped and the data
    *                   was added to the histogram, False otherwise.
    */
-  finishKeyed(aHistogram, aKey, aObj, aCanceledOkay) {
-    return TelemetryStopwatchImpl.finish(aHistogram, aObj, aKey, aCanceledOkay);
+  finishKeyed(aHistogram, aKey, aObj) {
+    return TelemetryStopwatchImpl.finish(aHistogram, aObj, aKey);
   }
 };
 
@@ -308,14 +291,12 @@ this.TelemetryStopwatchImpl = {
     return Timers.delete(histogram, object, key);
   },
 
-  timeElapsed(histogram, object, key, aCanceledOkay) {
+  timeElapsed(histogram, object, key) {
     let startTime = Timers.get(histogram, object, key);
     if (startTime === null) {
-      if (!aCanceledOkay) {
-        Cu.reportError("TelemetryStopwatch: requesting elapsed time for " +
-                       `nonexisting stopwatch. Histogram: "${histogram}", ` +
-                       `key: "${key}"`);
-      }
+      Cu.reportError("TelemetryStopwatch: requesting elapsed time for " +
+                     `nonexisting stopwatch. Histogram: "${histogram}", ` +
+                     `key: "${key}"`);
       return -1;
     }
 
@@ -330,8 +311,8 @@ this.TelemetryStopwatchImpl = {
     }
   },
 
-  finish(histogram, object, key, aCanceledOkay) {
-    let delta = this.timeElapsed(histogram, object, key, aCanceledOkay);
+  finish(histogram, object, key) {
+    let delta = this.timeElapsed(histogram, object, key);
     if (delta == -1) {
       return false;
     }
diff --git a/toolkit/components/telemetry/docs/collection/measuring-time.rst b/toolkit/components/telemetry/docs/collection/measuring-time.rst
index 6d27e8318bbb5..918c8a85a4b55 100644
--- a/toolkit/components/telemetry/docs/collection/measuring-time.rst
+++ b/toolkit/components/telemetry/docs/collection/measuring-time.rst
@@ -44,19 +44,6 @@ Example:
     // ... do more work.
     TelemetryStopwatch.finish("SAMPLE_FILE_LOAD_TIME_MS");
 
-    // Periodically, it's necessary to attempt to finish a
-    // TelemetryStopwatch that's already been canceled or
-    // finished. Normally, that throws a warning to the
-    // console. If the TelemetryStopwatch being possibly
-    // cancelled or finished is expected behaviour, the
-    // warning can be suppressed by passing the optional
-    // aCanceledOkay argument.
-
-    // ... suppress warning on a previously finished
-    // TelemetryStopwatch
-    TelemetryStopwatch.finish("SAMPLE_FILE_LOAD_TIME_MS", null,
-                              true /* aCanceledOkay */);
-
 From C++
 ========
 

From b857a9f8b678ad325f5c4696d721b3b27cbe06b9 Mon Sep 17 00:00:00 2001
From: Zibi Braniecki 
Date: Wed, 22 Mar 2017 00:38:55 -0700
Subject: [PATCH 063/300] Bug 1349454 - Use OS locale to localize font names.
 r=Pike

MozReview-Commit-ID: 8O60H6IIkmc
---
 gfx/thebes/gfxDWriteFontList.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/gfx/thebes/gfxDWriteFontList.cpp b/gfx/thebes/gfxDWriteFontList.cpp
index 0b4b796f6cda5..69c897013abb5 100644
--- a/gfx/thebes/gfxDWriteFontList.cpp
+++ b/gfx/thebes/gfxDWriteFontList.cpp
@@ -5,7 +5,7 @@
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/MemoryReporting.h"
-#include "mozilla/intl/LocaleService.h"
+#include "mozilla/intl/OSPreferences.h"
 
 #include "gfxDWriteFontList.h"
 #include "gfxDWriteFonts.h"
@@ -27,7 +27,7 @@
 #include "harfbuzz/hb.h"
 
 using namespace mozilla;
-using mozilla::intl::LocaleService;
+using mozilla::intl::OSPreferences;
 
 #define LOG_FONTLIST(args) MOZ_LOG(gfxPlatform::GetLog(eGfxLog_fontlist), \
                                LogLevel::Debug, args)
@@ -274,7 +274,9 @@ gfxDWriteFontFamily::LocalizedName(nsAString &aLocalizedName)
     aLocalizedName.AssignLiteral("Unknown Font");
     HRESULT hr;
     nsAutoCString locale;
-    LocaleService::GetInstance()->GetAppLocaleAsLangTag(locale);
+    // We use system locale here because it's what user expects to see.
+    // See bug 1349454 for details.
+    OSPreferences::GetInstance()->GetSystemLocale(locale);
 
     RefPtr names;
 

From 89061bdaa4f72d3dcbd202e5479db597d6df3255 Mon Sep 17 00:00:00 2001
From: tiago 
Date: Mon, 20 Mar 2017 02:03:02 +0100
Subject: [PATCH 064/300] Bug 1347248 - Change "nonexistent" for null and query
 to use CASE WHEN r=mak

MozReview-Commit-ID: I41bOputlIq
---
 toolkit/components/places/Bookmarks.jsm | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/toolkit/components/places/Bookmarks.jsm b/toolkit/components/places/Bookmarks.jsm
index de7bd8d71103b..36c6fcfcba827 100644
--- a/toolkit/components/places/Bookmarks.jsm
+++ b/toolkit/components/places/Bookmarks.jsm
@@ -1223,10 +1223,10 @@ function insertBookmark(item, parent) {
         `INSERT INTO moz_bookmarks (fk, type, parent, position, title,
                                     dateAdded, lastModified, guid,
                                     syncChangeCounter, syncStatus)
-         VALUES ((SELECT id FROM moz_places WHERE url_hash = hash(:url) AND url = :url), :type, :parent,
-                 :index, :title, :date_added, :last_modified, :guid,
-                 :syncChangeCounter, :syncStatus)
-        `, { url: item.hasOwnProperty("url") ? item.url.href : "nonexistent",
+         VALUES (CASE WHEN :url ISNULL THEN NULL ELSE (SELECT id FROM moz_places WHERE url_hash = hash(:url) AND url = :url) END,
+                 :type, :parent, :index, :title, :date_added, :last_modified,
+                 :guid, :syncChangeCounter, :syncStatus)
+        `, { url: item.hasOwnProperty("url") ? item.url.href : null,
              type: item.type, parent: parent._id, index: item.index,
              title: item.title, date_added: PlacesUtils.toPRTime(item.dateAdded),
              last_modified: PlacesUtils.toPRTime(item.lastModified), guid: item.guid,

From bfd85f5a6402dad2ebbd3dbfe7c905830b90fa8c Mon Sep 17 00:00:00 2001
From: Kit Cambridge 
Date: Tue, 21 Mar 2017 11:54:06 -0700
Subject: [PATCH 065/300] Bug 1343093 - Add integration test for bookmark
 repair. r=markh

This test replaces the clients engine to simulate two different
clients, and uses `SOURCE_SYNC` to bypass change tracking.

MozReview-Commit-ID: IF3b3WZtain
---
 services/sync/modules/bookmark_repair.js      |  25 +-
 services/sync/modules/engines/clients.js      |   2 +-
 .../sync/tests/unit/test_bookmark_repair.js   | 235 +++++++++++++++---
 .../unit/test_bookmark_repair_requestor.js    |  20 +-
 .../unit/test_bookmark_repair_responder.js    |   2 +-
 5 files changed, 227 insertions(+), 57 deletions(-)

diff --git a/services/sync/modules/bookmark_repair.js b/services/sync/modules/bookmark_repair.js
index 282a190923b38..69131de4264d5 100644
--- a/services/sync/modules/bookmark_repair.js
+++ b/services/sync/modules/bookmark_repair.js
@@ -89,12 +89,6 @@ class BookmarkRepairRequestor extends CollectionRepairRequestor {
     this.prefs = new Preferences(PREF_BRANCH);
   }
 
-  /* Exposed incase another module needs to understand our state
-  */
-  get STATE() {
-    return STATE;
-  }
-
   /* Check if any other clients connected to our account are current performing
      a repair. A thin wrapper which exists mainly for mocking during tests.
   */
@@ -186,13 +180,6 @@ class BookmarkRepairRequestor extends CollectionRepairRequestor {
       return false;
     }
 
-    if (this.anyClientsRepairing()) {
-      log.info("Can't start repair, since other clients are already repairing bookmarks");
-      let extra = { flowID, reason: "other clients repairing" };
-      this.service.recordTelemetryEvent("repair", "aborted", undefined, extra)
-      return false;
-    }
-
     let ids = this.getProblemIDs(validationInfo);
     if (ids.size > MAX_REQUESTED_IDS) {
       log.info("Not starting a repair as there are over " + MAX_REQUESTED_IDS + " problems");
@@ -206,6 +193,13 @@ class BookmarkRepairRequestor extends CollectionRepairRequestor {
       return false;
     }
 
+    if (this.anyClientsRepairing()) {
+      log.info("Can't start repair, since other clients are already repairing bookmarks");
+      let extra = { flowID, reason: "other clients repairing" };
+      this.service.recordTelemetryEvent("repair", "aborted", undefined, extra)
+      return false;
+    }
+
     log.info(`Starting a repair, looking for ${ids.size} missing item(s)`);
     // setup our prefs to indicate we are on our way.
     this._flowID = flowID;
@@ -720,3 +714,8 @@ class BookmarkRepairResponder extends CollectionRepairResponder {
     // that should be rare, so let's wait and see what telemetry tells us.
   }
 }
+
+/* Exposed in case another module needs to understand our state.
+*/
+BookmarkRepairRequestor.STATE = STATE;
+BookmarkRepairRequestor.PREF = PREF;
diff --git a/services/sync/modules/engines/clients.js b/services/sync/modules/engines/clients.js
index 47162682aea75..a6a5d292031c4 100644
--- a/services/sync/modules/engines/clients.js
+++ b/services/sync/modules/engines/clients.js
@@ -406,7 +406,7 @@ ClientEngine.prototype = {
           continue;
         }
         // fixup the client record, so our copy of _remoteClients matches what we uploaded.
-        clientRecord.commands = this._store.createRecord(id);
+        this._store._remoteClients[id] =  this._store.createRecord(id);
         // we could do better and pass the reference to the record we just uploaded,
         // but this will do for now
       }
diff --git a/services/sync/tests/unit/test_bookmark_repair.js b/services/sync/tests/unit/test_bookmark_repair.js
index 72069dd579e6c..d3429b9510534 100644
--- a/services/sync/tests/unit/test_bookmark_repair.js
+++ b/services/sync/tests/unit/test_bookmark_repair.js
@@ -5,36 +5,63 @@
 // many mocks)
 Cu.import("resource://gre/modules/PlacesUtils.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
+Cu.import("resource://gre/modules/osfile.jsm");
+Cu.import("resource://services-sync/bookmark_repair.js");
 Cu.import("resource://services-sync/constants.js");
+Cu.import("resource://services-sync/doctor.js");
 Cu.import("resource://services-sync/service.js");
 Cu.import("resource://services-sync/engines/clients.js");
 Cu.import("resource://services-sync/engines/bookmarks.js");
 Cu.import("resource://testing-common/services/sync/utils.js");
 
+const LAST_BOOKMARK_SYNC_PREFS = [
+  "bookmarks.lastSync",
+  "bookmarks.lastSyncLocal",
+];
+
+const BOOKMARK_REPAIR_STATE_PREFS = [
+  "client.GUID",
+  "doctor.lastRepairAdvance",
+  ...LAST_BOOKMARK_SYNC_PREFS,
+  ...Object.values(BookmarkRepairRequestor.PREF).map(name =>
+    `repairs.bookmarks.${name}`
+  ),
+];
+
 initTestLogging("Trace");
 Log.repository.getLogger("Sync.Engine.Bookmarks").level = Log.Level.Trace
 Log.repository.getLogger("Sync.Engine.Clients").level = Log.Level.Trace
 Log.repository.getLogger("Sqlite").level = Log.Level.Info; // less noisy
 
-const bms = PlacesUtils.bookmarks;
-
-//Service.engineManager.register(BookmarksEngine);
 let clientsEngine = Service.clientsEngine;
 let bookmarksEngine = Service.engineManager.get("bookmarks");
 
 generateNewKeys(Service.collectionKeys);
 
-function createFolder(parentId, title) {
-  let id = bms.createFolder(parentId, title, 0);
-  let guid = bookmarksEngine._store.GUIDForId(id);
-  return { id, guid };
+var recordedEvents = [];
+Service.recordTelemetryEvent = (object, method, value, extra = undefined) => {
+  recordedEvents.push({ object, method, value, extra });
+};
+
+function checkRecordedEvents(expected, message) {
+  deepEqual(recordedEvents, expected, message);
+  // and clear the list so future checks are easier to write.
+  recordedEvents = [];
 }
 
-function createBookmark(parentId, url, title, index = bms.DEFAULT_INDEX) {
-  let uri = Utils.makeURI(url);
-  let id = bms.insertBookmark(parentId, uri, index, title)
-  let guid = bookmarksEngine._store.GUIDForId(id);
-  return { id, guid };
+// Backs up and resets all preferences to their default values. Returns a
+// function that restores the preferences when called.
+function backupPrefs(names) {
+  let state = new Map();
+  for (let name of names) {
+    state.set(name, Svc.Prefs.get(name));
+    Svc.Prefs.reset(name);
+  }
+  return () => {
+    for (let [name, value] of state) {
+      Svc.Prefs.set(name, value);
+    }
+  };
 }
 
 async function promiseValidationDone(expected) {
@@ -57,7 +84,7 @@ async function cleanup(server) {
   await promiseStopServer(server);
 }
 
-add_task(async function test_something() {
+add_task(async function test_bookmark_repair_integration() {
   enableValidationPrefs();
 
   _("Ensure that a validation error triggers a repair request.");
@@ -103,50 +130,194 @@ add_task(async function test_something() {
       protocols: ["1.5"],
     }), Date.now() / 1000));
 
-    // Create a couple of bookmarks.
-    let folderInfo = createFolder(bms.toolbarFolder, "Folder 1");
-    let bookmarkInfo = createBookmark(folderInfo.id, "http://getfirefox.com/", "Get Firefox!");
+    _("Create bookmark and folder");
+    let folderInfo = await PlacesUtils.bookmarks.insert({
+      parentGuid: PlacesUtils.bookmarks.toolbarGuid,
+      type: PlacesUtils.bookmarks.TYPE_FOLDER,
+      title: "Folder 1",
+    });
+    let bookmarkInfo = await PlacesUtils.bookmarks.insert({
+      parentGuid: folderInfo.guid,
+      url: "http://getfirefox.com/",
+      title: "Get Firefox!",
+    });
 
+    _(`Upload ${folderInfo.guid} and ${bookmarkInfo.guid} to server`);
     let validationPromise = promiseValidationDone([]);
-    _("Syncing.");
     Service.sync();
-    // should have 2 clients
-    equal(clientsEngine.stats.numClients, 2)
+    equal(clientsEngine.stats.numClients, 2, "Clients collection should have 2 records");
     await validationPromise;
+    checkRecordedEvents([], "Should not start repair after first sync");
 
+    _("Back up last sync timestamps for remote client");
+    let restoreRemoteLastBookmarkSync = backupPrefs(LAST_BOOKMARK_SYNC_PREFS);
+
+    _(`Delete ${bookmarkInfo.guid} locally and on server`);
     // Now we will reach into the server and hard-delete the bookmark
-    user.collection("bookmarks").wbo(bookmarkInfo.guid).delete();
+    user.collection("bookmarks").remove(bookmarkInfo.guid);
     // And delete the bookmark, but cheat by telling places that Sync did
-    // it, so we don't end up with an orphan.
-    // and use SQL to hard-delete the bookmark from the store.
-    await bms.remove(bookmarkInfo.guid, {
-      source: bms.SOURCE_SYNC,
+    // it, so we don't end up with a tombstone.
+    await PlacesUtils.bookmarks.remove(bookmarkInfo.guid, {
+      source: PlacesUtils.bookmarks.SOURCE_SYNC,
     });
-    // sanity check we aren't going to sync this removal.
-    do_check_empty(bookmarksEngine.pullNewChanges());
+    deepEqual(bookmarksEngine.pullNewChanges(), {},
+      `Should not upload tombstone for ${bookmarkInfo.guid}`);
 
     // sync again - we should have a few problems...
-    _("Syncing again.");
+    _("Sync again to trigger repair");
     validationPromise = promiseValidationDone([
       {"name":"missingChildren","count":1},
       {"name":"structuralDifferences","count":1},
     ]);
     Service.sync();
     await validationPromise;
+    let flowID = Svc.Prefs.get("repairs.bookmarks.flowID");
+    checkRecordedEvents([{
+      object: "repair",
+      method: "started",
+      value: undefined,
+      extra: {
+        flowID,
+        numIDs: "1",
+      },
+    }, {
+      object: "sendcommand",
+      method: "repairRequest",
+      value: undefined,
+      extra: {
+        flowID,
+        deviceID: Service.identity.hashedDeviceID(remoteID),
+      },
+    }, {
+      object: "repair",
+      method: "request",
+      value: "upload",
+      extra: {
+        deviceID: Service.identity.hashedDeviceID(remoteID),
+        flowID,
+        numIDs: "1",
+      },
+    }], "Should record telemetry events for repair request");
 
     // We should have started a repair with our second client.
-    equal(clientsEngine.getClientCommands(remoteID).length, 1);
-    _("Syncing so the outgoing client command is sent.");
+    equal(clientsEngine.getClientCommands(remoteID).length, 1,
+      "Should queue repair request for remote client after repair");
+    _("Sync to send outgoing repair request");
     Service.sync();
-    equal(clientsEngine.getClientCommands(remoteID).length, 0);
+    equal(clientsEngine.getClientCommands(remoteID).length, 0,
+      "Should send repair request to remote client after next sync");
+    checkRecordedEvents([],
+      "Should not record repair telemetry after sending repair request");
+
+    _("Back up repair state to restore later");
+    let restoreInitialRepairState = backupPrefs(BOOKMARK_REPAIR_STATE_PREFS);
 
     // so now let's take over the role of that other client!
+    _("Create new clients engine pretending to be remote client");
     let remoteClientsEngine = Service.clientsEngine = new ClientEngine(Service);
     remoteClientsEngine.localID = remoteID;
-    _("what could possibly go wrong?");
+
+    _("Restore missing bookmark");
+    // Pretend Sync wrote the bookmark, so that we upload it as part of the
+    // repair instead of the sync.
+    bookmarkInfo.source = PlacesUtils.bookmarks.SOURCE_SYNC;
+    await PlacesUtils.bookmarks.insert(bookmarkInfo);
+    restoreRemoteLastBookmarkSync();
+
+    _("Sync as remote client");
+    Service.sync();
+    checkRecordedEvents([{
+      object: "processcommand",
+      method: "repairRequest",
+      value: undefined,
+      extra: {
+        flowID,
+      },
+    }, {
+      object: "repairResponse",
+      method: "uploading",
+      value: undefined,
+      extra: {
+        flowID,
+        numIDs: "1",
+      },
+    }, {
+      object: "sendcommand",
+      method: "repairResponse",
+      value: undefined,
+      extra: {
+        flowID,
+        deviceID: Service.identity.hashedDeviceID(initialID),
+      },
+    }, {
+      object: "repairResponse",
+      method: "finished",
+      value: undefined,
+      extra: {
+        flowID,
+        numIDs: "1",
+      }
+    }], "Should record telemetry events for repair response");
+
+    // We should queue the repair response for the initial client.
+    equal(remoteClientsEngine.getClientCommands(initialID).length, 1,
+      "Should queue repair response for initial client after repair");
+    ok(user.collection("bookmarks").wbo(bookmarkInfo.guid),
+      "Should upload missing bookmark");
+
+    _("Sync to upload bookmark and send outgoing repair response");
     Service.sync();
+    equal(remoteClientsEngine.getClientCommands(initialID).length, 0,
+      "Should send repair response to initial client after next sync");
+    checkRecordedEvents([],
+      "Should not record repair telemetry after sending repair response");
+    ok(!Services.prefs.prefHasUserValue("services.sync.repairs.bookmarks.state"),
+      "Remote client should not be repairing");
+
+    _("Pretend to be initial client again");
+    Service.clientsEngine = clientsEngine;
 
-    // TODO - make the rest of this work!
+    _("Restore incomplete Places database and prefs");
+    await PlacesUtils.bookmarks.remove(bookmarkInfo.guid, {
+      source: PlacesUtils.bookmarks.SOURCE_SYNC,
+    });
+    restoreInitialRepairState();
+    ok(Services.prefs.prefHasUserValue("services.sync.repairs.bookmarks.state"),
+      "Initial client should still be repairing");
+
+    _("Sync as initial client");
+    let revalidationPromise = promiseValidationDone([]);
+    Service.sync();
+    let restoredBookmarkInfo = await PlacesUtils.bookmarks.fetch(bookmarkInfo.guid);
+    ok(restoredBookmarkInfo, "Missing bookmark should be downloaded to initial client");
+    checkRecordedEvents([{
+      object: "processcommand",
+      method: "repairResponse",
+      value: undefined,
+      extra: {
+        flowID,
+      },
+    }, {
+      object: "repair",
+      method: "response",
+      value: "upload",
+      extra: {
+        flowID,
+        deviceID: Service.identity.hashedDeviceID(remoteID),
+        numIDs: "1",
+      },
+    }, {
+      object: "repair",
+      method: "finished",
+      value: undefined,
+      extra: {
+        flowID,
+        numIDs: "0",
+      },
+    }]);
+    await revalidationPromise;
+    ok(!Services.prefs.prefHasUserValue("services.sync.repairs.bookmarks.state"),
+      "Should clear repair pref after successfully completing repair");
   } finally {
     await cleanup(server);
   }
diff --git a/services/sync/tests/unit/test_bookmark_repair_requestor.js b/services/sync/tests/unit/test_bookmark_repair_requestor.js
index 2a41671be57fb..a840ccfa1cb87 100644
--- a/services/sync/tests/unit/test_bookmark_repair_requestor.js
+++ b/services/sync/tests/unit/test_bookmark_repair_requestor.js
@@ -133,16 +133,16 @@ add_task(async function test_requestor_one_client_no_response() {
   // the command should now be outgoing.
   checkOutgoingCommand(mockService, "client-a");
 
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
   // asking it to continue stays in that state until we timeout or the command
   // is removed.
   requestor.continueRepairs();
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
 
   // now pretend that client synced.
   mockService.clientsEngine._sentCommands = {};
   requestor.continueRepairs();
-  checkState(requestor.STATE.SENT_SECOND_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_SECOND_REQUEST);
   // the command should be outgoing again.
   checkOutgoingCommand(mockService, "client-a");
 
@@ -194,7 +194,7 @@ add_task(async function test_requestor_one_client_no_sync() {
   // the command should now be outgoing.
   checkOutgoingCommand(mockService, "client-a");
 
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
 
   // pretend we are now in the future.
   let theFuture = Date.now() + 300000000;
@@ -245,7 +245,7 @@ add_task(async function test_requestor_latest_client_used() {
   requestor.startRepairs(validationInfo, Utils.makeGUID());
   // the repair command should be outgoing to the most-recent client.
   checkOutgoingCommand(mockService, "client-late");
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
   // and this test is done - reset the repair.
   requestor.prefs.resetBranch();
 });
@@ -271,7 +271,7 @@ add_task(async function test_requestor_client_vanishes() {
   // the command should now be outgoing.
   checkOutgoingCommand(mockService, "client-a");
 
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
 
   mockService.clientsEngine._sentCommands = {};
   // Now let's pretend the client vanished.
@@ -279,7 +279,7 @@ add_task(async function test_requestor_client_vanishes() {
 
   requestor.continueRepairs();
   // We should have moved on to client-b.
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
   checkOutgoingCommand(mockService, "client-b");
 
   // Now let's pretend client B wrote all missing IDs.
@@ -349,7 +349,7 @@ add_task(async function test_requestor_success_responses() {
   // the command should now be outgoing.
   checkOutgoingCommand(mockService, "client-a");
 
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
 
   mockService.clientsEngine._sentCommands = {};
   // Now let's pretend the client wrote a response.
@@ -362,7 +362,7 @@ add_task(async function test_requestor_success_responses() {
   }
   requestor.continueRepairs(response);
   // We should have moved on to client 2.
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
   checkOutgoingCommand(mockService, "client-b");
 
   // Now let's pretend client B write the missing ID.
@@ -469,7 +469,7 @@ add_task(async function test_requestor_already_repairing_continue() {
   // the command should now be outgoing.
   checkOutgoingCommand(mockService, "client-a");
 
-  checkState(requestor.STATE.SENT_REQUEST);
+  checkState(BookmarkRepairRequestor.STATE.SENT_REQUEST);
   mockService.clientsEngine._sentCommands = {};
 
   // Now let's pretend the client wrote a response (it doesn't matter what's in here)
diff --git a/services/sync/tests/unit/test_bookmark_repair_responder.js b/services/sync/tests/unit/test_bookmark_repair_responder.js
index 7d4490ce192f0..060a3b2543db1 100644
--- a/services/sync/tests/unit/test_bookmark_repair_responder.js
+++ b/services/sync/tests/unit/test_bookmark_repair_responder.js
@@ -21,7 +21,7 @@ Log.repository.getLogger("Sqlite").level = Log.Level.Error;
 var recordedEvents = [];
 Service.recordTelemetryEvent = (object, method, value, extra = undefined) => {
   recordedEvents.push({ object, method, value, extra });
-}
+};
 
 function checkRecordedEvents(expected) {
   deepEqual(recordedEvents, expected);

From fa0ef0be282edb5d94db47209f41a203c6321770 Mon Sep 17 00:00:00 2001
From: Marco Bonardo 
Date: Wed, 22 Mar 2017 12:13:42 +0100
Subject: [PATCH 066/300] Bug 1346736 - invalid icon in default bookmarks.
 r=standard8

MozReview-Commit-ID: GUQtPPgaS1f
---
 browser/locales/generic/profile/bookmarks.html.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/browser/locales/generic/profile/bookmarks.html.in b/browser/locales/generic/profile/bookmarks.html.in
index 15265554c1780..57de834a19466 100644
--- a/browser/locales/generic/profile/bookmarks.html.in
+++ b/browser/locales/generic/profile/bookmarks.html.in
@@ -15,7 +15,7 @@
 
 #define mdn_icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAACYklEQVQ4y3WSTYjNYRTGf+f9/+/NuDN3GKMxt1mYpKR8RT6zEk1iyUo2IysSNspCxEIZRSN07YiUJSWkaUIZizELMzIZlO9h3MzXvf/341jcmTGa69RZvKfnPOc5z3mhQlRd651Ry17tqQQl5uR9ONHC3EtdiPPxWKZ24bhJvQV0OlBHhiV7pTs3WpUdEmeLrnWJAhhOtJA5/3RjqZg8Lrnwy4bQT/DvTb73Qt3N9ymATNvTU15Mvx8vfvTWDrmgT0y+dzuAZM527lM0Xx6jFKvnEKIYvIIqVeMFRCfEiDBWMw9UQUBUT8fBWvmrU9HEUpUWDq2cT23a0P6kQEqEwTFLQCBJpm9mYrV+6lW0ngNr62jb0kw6KvMeXJohZYSLzz9xvOMDJG6aPUKMtZPDObq+iXPbmoG/ooJC0QVaVy2g5AI3Bkq8/jYCkQEBo9ah1hESS1N1Gu9DxXNFRji0oYm+/Stoaa4tK0kcRq1HE4fxHqOKEf4bk16ubphd9iKxGKxFrcOWLB1vvuOCzmg0Irig1MxKMfBznPbOd2DLCmJNHKgSIdzr/kjXhwKbFtVPNQ+NJiw7+YDh0YTFuVr6CwLpaNJDjCYOtR61DldyHL7975c9dqeH4ZESscC7r79BFBI7kY5YrZsCC8qL/kFyR+6yY0UjS3M1PHz5ich71IOIQGSn0cskwdTeryTyfV9+jGzOP3rTQAiIHUNQEBkCeUbkcqguB2JEMGqt4sJlg8lGIsv0+p5dON8YaVgn3veJ85/F61YNtn5uXf3OCF0TQVacP0PiXMVzpfbemlnbna+I/QPSFTsRLd+hHAAAAABJRU5ErkJggg==
 
-#define addon_icon data:image/vndmicrosofticon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKoSURBVDiNjZNLaJRnFIaf75vvy2UGTWr8NYkxl0IFUYkNXSSZQNWFWlxIEVy1FLLo0i4adddVXRnS4kJwYxci2GaRTWlSFGKFGRXNmFBF62VMO4TENBdjMv9k5p//Oy4SLzgqHs7yPc95eTlHiQjvqniPbVYRzuBoR+FQDEvId4neIPNCY945DayNVff/8NUvn9XXNJMv5hhKnTvYP3ymHmj/IMBSbmHjjP8fycxv+MEzGqtatUI1vK7R7wM4J32XUv3Li/l5imGBkbtXlsMw/PF1jXozg3iP3aM0Z8XRBFDr1fl7Og9EnTguXx30p/6fjAIozb/i6C4BdB2z6QOfH27ZUFNL0QUELs/tycs4J2zdGEerCADTM1P8df3PxyUZiKPF8zyGHpwGFLC6QCCRuYA4QQQ6mw4hjhYT77GN2qiBWFnV5sXc0xMAgfKx5foVYKURB2vLPbxoM8auODE6ws/fH+77dHtjhxp5OHzywpWf/IIsRk25Rq0CRFY4UVNNndkmqZFRf3YuWaYUS0aE3RP5MXX3/iCOgu3Y1WYfL90sdSDgxRoYTY5mZ2anjwC/AqEBdM4tMJ4dwYs1YiOGSBkYrVHqlQNxoC34OV8BdxK9gQ+guo7bwdYdrXu92nU6nR7Pzc/PSXxfazTj30IpRaWpIqbX4UQoBDkWJlRwLzVeLBTyGs2UcUX5duzvsfPqNpvDovQhnBIdELGaWFk1hclYmLx2fxmFbNm5qXJNvdi2DQ1WAsO1P/5petshyf6v25gJ0nxUUUeiP531s/kvAcor7MDOL2pjz3JzVKpqUoMTpb8QsSqdeTT98fomjyDv8LP5aKI3uAgQP2orCkGAVRVMZxbQhnQJIAzkm3s3Js6GSfkEQEd4+bpa8+TW71P1ANqoB65I93OA2DgV+Z+omgAAAABJRU5ErkJggg==
+#define addon_icon data:image/vnd.microsoft.icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKoSURBVDiNjZNLaJRnFIaf75vvy2UGTWr8NYkxl0IFUYkNXSSZQNWFWlxIEVy1FLLo0i4adddVXRnS4kJwYxci2GaRTWlSFGKFGRXNmFBF62VMO4TENBdjMv9k5p//Oy4SLzgqHs7yPc95eTlHiQjvqniPbVYRzuBoR+FQDEvId4neIPNCY945DayNVff/8NUvn9XXNJMv5hhKnTvYP3ymHmj/IMBSbmHjjP8fycxv+MEzGqtatUI1vK7R7wM4J32XUv3Li/l5imGBkbtXlsMw/PF1jXozg3iP3aM0Z8XRBFDr1fl7Og9EnTguXx30p/6fjAIozb/i6C4BdB2z6QOfH27ZUFNL0QUELs/tycs4J2zdGEerCADTM1P8df3PxyUZiKPF8zyGHpwGFLC6QCCRuYA4QQQ6mw4hjhYT77GN2qiBWFnV5sXc0xMAgfKx5foVYKURB2vLPbxoM8auODE6ws/fH+77dHtjhxp5OHzywpWf/IIsRk25Rq0CRFY4UVNNndkmqZFRf3YuWaYUS0aE3RP5MXX3/iCOgu3Y1WYfL90sdSDgxRoYTY5mZ2anjwC/AqEBdM4tMJ4dwYs1YiOGSBkYrVHqlQNxoC34OV8BdxK9gQ+guo7bwdYdrXu92nU6nR7Pzc/PSXxfazTj30IpRaWpIqbX4UQoBDkWJlRwLzVeLBTyGs2UcUX5duzvsfPqNpvDovQhnBIdELGaWFk1hclYmLx2fxmFbNm5qXJNvdi2DQ1WAsO1P/5petshyf6v25gJ0nxUUUeiP531s/kvAcor7MDOL2pjz3JzVKpqUoMTpb8QsSqdeTT98fomjyDv8LP5aKI3uAgQP2orCkGAVRVMZxbQhnQJIAzkm3s3Js6GSfkEQEd4+bpa8+TW71P1ANqoB65I93OA2DgV+Z+omgAAAABJRU5ErkJggg==
 

From 2cc84e10ed18dcc7f4f021538b52987c1a07c360 Mon Sep 17 00:00:00 2001
From: Henrik Skupin 
Date: Wed, 22 Mar 2017 16:11:16 +0100
Subject: [PATCH 067/300] Bug 1322383 - Hardening screenshot tests by forcing
 about:blank to be loaded by default. r=automatedtester

If no default page is set it can be that former tests loaded a page which still shows
the load status at the lower left corner of Firefox. This can lead to intermittent
test failures.

MozReview-Commit-ID: 77MDIRtjA4j
---
 .../harness/marionette_harness/tests/unit/test_screenshot.py  | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py b/testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py
index aa0e6ab1c3a84..41e873db3939d 100644
--- a/testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py
@@ -40,6 +40,10 @@ def setUp(self):
 
         self._device_pixel_ratio = None
 
+        # Ensure that each screenshot test runs on a blank page to avoid left
+        # over elements or focus which could interfer with taking screenshots
+        self.marionette.navigate("about:blank")
+
     @property
     def device_pixel_ratio(self):
         if self._device_pixel_ratio is None:

From 9e17e07297f4710f14683d222ce37b82d4d4afbf Mon Sep 17 00:00:00 2001
From: Henrik Skupin 
Date: Tue, 21 Mar 2017 12:02:47 +0100
Subject: [PATCH 068/300] Bug 1322383 - Ensure that finalizers for webdriver
 tests always work on a valid window. r=jgraham

In case of tests are closing the current window, and do not switch back to
a valid window, the finalizers will fail because the window to operate on
doesn't exist anymore.

MozReview-Commit-ID: 8tX6oK45530
---
 testing/web-platform/tests/webdriver/conftest.py     |  1 +
 testing/web-platform/tests/webdriver/util/cleanup.py | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/testing/web-platform/tests/webdriver/conftest.py b/testing/web-platform/tests/webdriver/conftest.py
index d614cd1be48a7..13092678918cd 100644
--- a/testing/web-platform/tests/webdriver/conftest.py
+++ b/testing/web-platform/tests/webdriver/conftest.py
@@ -36,6 +36,7 @@ def session(_session, request):
     request.addfinalizer(lambda: cleanup.switch_to_top_level_browsing_context(_session))
     request.addfinalizer(lambda: cleanup.restore_windows(_session))
     request.addfinalizer(lambda: cleanup.dismiss_user_prompts(_session))
+    request.addfinalizer(lambda: cleanup.ensure_valid_window(_session))
 
     return _session
 
diff --git a/testing/web-platform/tests/webdriver/util/cleanup.py b/testing/web-platform/tests/webdriver/util/cleanup.py
index c86d172550fad..7f3232f548166 100644
--- a/testing/web-platform/tests/webdriver/util/cleanup.py
+++ b/testing/web-platform/tests/webdriver/util/cleanup.py
@@ -1,5 +1,14 @@
 import webdriver
 
+
+def ensure_valid_window(session):
+    """If current window is not open anymore, ensure to have a valid one selected."""
+    try:
+        session.window_handle
+    except webdriver.NoSuchWindowException:
+        session.window_handle = session.handles[0]
+
+
 def dismiss_user_prompts(session):
     """Dismisses any open user prompts in windows."""
     current_window = session.window_handle
@@ -13,6 +22,7 @@ def dismiss_user_prompts(session):
 
     session.window_handle = current_window
 
+
 def restore_windows(session):
     """Closes superfluous windows opened by the test without ending
     the session implicitly by closing the last window.
@@ -26,6 +36,7 @@ def restore_windows(session):
 
     session.window_handle = current_window
 
+
 def switch_to_top_level_browsing_context(session):
     """If the current browsing context selected by WebDriver is a
     `` or an `
+

iframe 1

+ diff --git a/devtools/client/themes/boxmodel.css b/devtools/client/themes/boxmodel.css index d8e2b4d31efdb..4cef659de5aa0 100644 --- a/devtools/client/themes/boxmodel.css +++ b/devtools/client/themes/boxmodel.css @@ -52,7 +52,7 @@ /* Regions are 3 nested elements with wide borders and outlines */ -.boxmodel-content { +.boxmodel-contents { height: 18px; } @@ -84,7 +84,7 @@ border-color: #6a5acd; } -.boxmodel-content { +.boxmodel-contents { background-color: #87ceeb; } @@ -104,7 +104,8 @@ /* Editable region sizes are contained in absolutely positioned

*/ -.boxmodel-main > p { +.boxmodel-main > p, +.boxmodel-size { position: absolute; pointer-events: none; margin: 0; @@ -112,7 +113,8 @@ } .boxmodel-main > p > span, -.boxmodel-main > p > input { +.boxmodel-main > p > input, +.boxmodel-content { vertical-align: middle; pointer-events: auto; } @@ -172,8 +174,8 @@ .boxmodel-position.boxmodel-right, .boxmodel-margin.boxmodel-right, .boxmodel-margin.boxmodel-left, -.boxmodel-border.boxmodel-left, .boxmodel-border.boxmodel-right, +.boxmodel-border.boxmodel-left, .boxmodel-padding.boxmodel-right, .boxmodel-padding.boxmodel-left { width: 21px; @@ -218,6 +220,12 @@ height: 30px; } +.boxmodel-size > p { + display: inline-block; + margin: auto; + line-height: 0; +} + .boxmodel-rotate.boxmodel-right.boxmodel-position:not(.boxmodel-editing) { border-top: none; border-left: 1px solid var(--theme-highlight-purple); @@ -290,8 +298,6 @@ border-bottom-color: hsl(0, 0%, 50%); } -/* Make sure the content size doesn't appear as editable like the other sizes */ - .boxmodel-size > span { cursor: default; } From d6fac392b2be8982a045b7ec34a06c0fc41d936c Mon Sep 17 00:00:00 2001 From: sotaro Date: Thu, 23 Mar 2017 11:00:41 +0900 Subject: [PATCH 209/300] Bug 1349476 - Remove LayersBackend::LAYERS_D3D9 type r=mattwoodrow --- .../platforms/wmf/WMFVideoMFTManager.cpp | 23 ++++++++----------- dom/media/platforms/wmf/WMFVideoMFTManager.h | 4 ++-- gfx/layers/LayersTypes.h | 1 - gfx/layers/client/CanvasClient.cpp | 2 -- gfx/layers/client/ClientLayerManager.cpp | 1 - gfx/layers/client/ContentClient.cpp | 1 - gfx/tests/gtest/TestCompositor.cpp | 3 --- widget/GfxInfoBase.cpp | 2 -- widget/windows/nsWindow.cpp | 2 +- 9 files changed, 12 insertions(+), 27 deletions(-) diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp index 48fa812b32e74..5a4a65c77a0d5 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp @@ -384,10 +384,9 @@ FindD3D9BlacklistedDLL() class CreateDXVAManagerEvent : public Runnable { public: - CreateDXVAManagerEvent(LayersBackend aBackend, - layers::KnowsCompositor* aKnowsCompositor, + CreateDXVAManagerEvent(layers::KnowsCompositor* aKnowsCompositor, nsCString& aFailureReason) - : mBackend(aBackend) + : mBackend(LayersBackend::LAYERS_D3D11) , mKnowsCompositor(aKnowsCompositor) , mFailureReason(aFailureReason) { @@ -435,7 +434,7 @@ class CreateDXVAManagerEvent : public Runnable }; bool -WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9) +WMFVideoMFTManager::InitializeDXVA() { // If we use DXVA but aren't running with a D3D layer manager then the // readback of decoded video frames from GPU to CPU memory grinds painting @@ -447,17 +446,14 @@ WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9) } MOZ_ASSERT(!mDXVA2Manager); LayersBackend backend = GetCompositorBackendType(mKnowsCompositor); - if (backend != LayersBackend::LAYERS_D3D9 - && backend != LayersBackend::LAYERS_D3D11) { + if (backend != LayersBackend::LAYERS_D3D11) { mDXVAFailureReason.AssignLiteral("Unsupported layers backend"); return false; } // The DXVA manager must be created on the main thread. RefPtr event = - new CreateDXVAManagerEvent(aForceD3D9 ? LayersBackend::LAYERS_D3D9 - : backend, - mKnowsCompositor, + new CreateDXVAManagerEvent(mKnowsCompositor, mDXVAFailureReason); if (NS_IsMainThread()) { @@ -499,7 +495,7 @@ WMFVideoMFTManager::Init() return false; } - bool success = InitInternal(/* aForceD3D9 = */ false); + bool success = InitInternal(); if (success && mDXVA2Manager) { // If we had some failures but eventually made it work, @@ -515,10 +511,10 @@ WMFVideoMFTManager::Init() } bool -WMFVideoMFTManager::InitInternal(bool aForceD3D9) +WMFVideoMFTManager::InitInternal() { mUseHwAccel = false; // default value; changed if D3D setup succeeds. - bool useDxva = InitializeDXVA(aForceD3D9); + bool useDxva = InitializeDXVA(); RefPtr decoder(new MFTDecoder()); @@ -869,8 +865,7 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample, nsIntRect pictureRegion = mVideoInfo.ScaledImageRect(videoWidth, videoHeight); LayersBackend backend = GetCompositorBackendType(mKnowsCompositor); - if (backend != LayersBackend::LAYERS_D3D9 && - backend != LayersBackend::LAYERS_D3D11) { + if (backend != LayersBackend::LAYERS_D3D11) { RefPtr v = VideoData::CreateAndCopyData(mVideoInfo, mImageContainer, diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.h b/dom/media/platforms/wmf/WMFVideoMFTManager.h index 74cc7857140e9..60f51cfa66278 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.h +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.h @@ -69,9 +69,9 @@ class WMFVideoMFTManager : public MFTManager private: bool ValidateVideoInfo(); - bool InitializeDXVA(bool aForceD3D9); + bool InitializeDXVA(); - bool InitInternal(bool aForceD3D9); + bool InitInternal(); HRESULT ConfigureVideoFrameGeometry(); diff --git a/gfx/layers/LayersTypes.h b/gfx/layers/LayersTypes.h index f9ac335c1c9b9..adc70fefb9f36 100644 --- a/gfx/layers/LayersTypes.h +++ b/gfx/layers/LayersTypes.h @@ -46,7 +46,6 @@ enum class LayersBackend : int8_t { LAYERS_NONE = 0, LAYERS_BASIC, LAYERS_OPENGL, - LAYERS_D3D9, LAYERS_D3D11, LAYERS_CLIENT, LAYERS_WR, diff --git a/gfx/layers/client/CanvasClient.cpp b/gfx/layers/client/CanvasClient.cpp index 19683a6c82b3e..03d406b5b924c 100644 --- a/gfx/layers/client/CanvasClient.cpp +++ b/gfx/layers/client/CanvasClient.cpp @@ -336,9 +336,7 @@ TexClientFromReadback(SharedSurface* src, CompositableForwarder* allocator, // RB_SWAPPED doesn't work with D3D11. (bug 1051010) // RB_SWAPPED doesn't work with Basic. (bug ???????) - // RB_SWAPPED doesn't work with D3D9. (bug ???????) bool layersNeedsManualSwap = layersBackend == LayersBackend::LAYERS_BASIC || - layersBackend == LayersBackend::LAYERS_D3D9 || layersBackend == LayersBackend::LAYERS_D3D11; if (texClient->HasFlags(TextureFlags::RB_SWAPPED) && layersNeedsManualSwap) diff --git a/gfx/layers/client/ClientLayerManager.cpp b/gfx/layers/client/ClientLayerManager.cpp index 9a57682b0b5f2..08fe6c4d2b13e 100644 --- a/gfx/layers/client/ClientLayerManager.cpp +++ b/gfx/layers/client/ClientLayerManager.cpp @@ -826,7 +826,6 @@ ClientLayerManager::GetBackendName(nsAString& aName) case LayersBackend::LAYERS_NONE: aName.AssignLiteral("None"); return; case LayersBackend::LAYERS_BASIC: aName.AssignLiteral("Basic"); return; case LayersBackend::LAYERS_OPENGL: aName.AssignLiteral("OpenGL"); return; - case LayersBackend::LAYERS_D3D9: aName.AssignLiteral("Direct3D 9"); return; case LayersBackend::LAYERS_D3D11: { #ifdef XP_WIN if (DeviceManagerDx::Get()->IsWARP()) { diff --git a/gfx/layers/client/ContentClient.cpp b/gfx/layers/client/ContentClient.cpp index 69384ae7ebdeb..1d2840920d844 100644 --- a/gfx/layers/client/ContentClient.cpp +++ b/gfx/layers/client/ContentClient.cpp @@ -61,7 +61,6 @@ ContentClient::CreateContentClient(CompositableForwarder* aForwarder) { LayersBackend backend = aForwarder->GetCompositorBackendType(); if (backend != LayersBackend::LAYERS_OPENGL && - backend != LayersBackend::LAYERS_D3D9 && backend != LayersBackend::LAYERS_D3D11 && backend != LayersBackend::LAYERS_WR && backend != LayersBackend::LAYERS_BASIC) { diff --git a/gfx/tests/gtest/TestCompositor.cpp b/gfx/tests/gtest/TestCompositor.cpp index 816c0d011aee7..0a8498bb69888 100644 --- a/gfx/tests/gtest/TestCompositor.cpp +++ b/gfx/tests/gtest/TestCompositor.cpp @@ -63,9 +63,6 @@ static already_AddRefed CreateTestCompositor(LayersBackend backend, } else if (backend == LayersBackend::LAYERS_D3D11) { //compositor = new CompositorD3D11(); MOZ_CRASH(); // No support yet - } else if (backend == LayersBackend::LAYERS_D3D9) { - //compositor = new CompositorD3D9(this, mWidget); - MOZ_CRASH(); // No support yet #endif } nsCString failureReason; diff --git a/widget/GfxInfoBase.cpp b/widget/GfxInfoBase.cpp index cf3974f8f0c93..c0443898d0f3a 100644 --- a/widget/GfxInfoBase.cpp +++ b/widget/GfxInfoBase.cpp @@ -1194,8 +1194,6 @@ GetLayersBackendName(layers::LayersBackend aBackend) return "none"; case layers::LayersBackend::LAYERS_OPENGL: return "opengl"; - case layers::LayersBackend::LAYERS_D3D9: - return "d3d9"; case layers::LayersBackend::LAYERS_D3D11: return "d3d11"; case layers::LayersBackend::LAYERS_CLIENT: diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 3314c75ca2f59..4fbb5b06cc65a 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -1833,7 +1833,7 @@ nsWindow::Move(double aX, double aY) // region, some drivers or OSes may incorrectly copy into the clipped-out // area. if (IsPlugin() && - (!mLayerManager || mLayerManager->GetBackendType() == LayersBackend::LAYERS_D3D9) && + !mLayerManager && mClipRects && (mClipRectCount != 1 || !mClipRects[0].IsEqualInterior(LayoutDeviceIntRect(0, 0, mBounds.width, mBounds.height)))) { flags |= SWP_NOCOPYBITS; From ff6edc961db0af47bc99eb738f37990c0843d261 Mon Sep 17 00:00:00 2001 From: Timothy Nikkel Date: Thu, 23 Mar 2017 00:02:54 -0500 Subject: [PATCH 210/300] Bug 1347302. Add animated image specific probes for several imagelib telemetry probes. r=aosmond f=bsmedberg --- image/RasterImage.cpp | 13 +++++++++ toolkit/components/telemetry/Histograms.json | 29 ++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index b987448502951..4fbc654c91227 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -107,6 +107,9 @@ RasterImage::~RasterImage() // Record Telemetry. Telemetry::Accumulate(Telemetry::IMAGE_DECODE_COUNT, mDecodeCount); + if (mAnimationState) { + Telemetry::Accumulate(Telemetry::IMAGE_ANIMATED_DECODE_COUNT, mDecodeCount); + } } nsresult @@ -1428,6 +1431,11 @@ RasterImage::Draw(gfxContext* aContext, TimeDuration drawLatency = TimeStamp::Now() - mDrawStartTime; Telemetry::Accumulate(Telemetry::IMAGE_DECODE_ON_DRAW_LATENCY, int32_t(drawLatency.ToMicroseconds())); + if (mAnimationState) { + Telemetry::Accumulate(Telemetry::IMAGE_ANIMATED_DECODE_ON_DRAW_LATENCY, + int32_t(drawLatency.ToMicroseconds())); + + } mDrawStartTime = TimeStamp(); } @@ -1677,6 +1685,11 @@ RasterImage::NotifyDecodeComplete(const DecoderFinalStatus& aStatus, Telemetry::Accumulate(Telemetry::IMAGE_DECODE_TIME, int32_t(aTelemetry.mDecodeTime.ToMicroseconds())); + if (mAnimationState) { + Telemetry::Accumulate(Telemetry::IMAGE_ANIMATED_DECODE_TIME, + int32_t(aTelemetry.mDecodeTime.ToMicroseconds())); + } + if (aTelemetry.mSpeedHistogram) { Telemetry::Accumulate(*aTelemetry.mSpeedHistogram, aTelemetry.Speed()); } diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index 023d76f4fb28b..6dd3f11dd891d 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -1444,6 +1444,16 @@ "n_buckets": 100, "description": "Time spent decoding an image (us)" }, + "IMAGE_ANIMATED_DECODE_TIME": { + "alert_emails": ["gfx-telemetry-alerts@mozilla.com"], + "bug_numbers": [1347302], + "expires_in_version": "57", + "kind": "exponential", + "low": 50, + "high": 50000000, + "n_buckets": 100, + "description": "Time spent decoding an animated image (us)" + }, "IMAGE_DECODE_ON_DRAW_LATENCY": { "expires_in_version": "never", "kind": "exponential", @@ -1452,6 +1462,16 @@ "n_buckets": 100, "description": "Time from starting a decode to it showing up on the screen (us)" }, + "IMAGE_ANIMATED_DECODE_ON_DRAW_LATENCY": { + "alert_emails": ["gfx-telemetry-alerts@mozilla.com"], + "bug_numbers": [1347302], + "expires_in_version": "57", + "kind": "exponential", + "low": 50, + "high": 50000000, + "n_buckets": 100, + "description": "Time from starting a decode of an animated image to it showing up on the screen (us)" + }, "IMAGE_DECODE_CHUNKS": { "expires_in_version": "never", "kind": "exponential", @@ -1466,6 +1486,15 @@ "n_buckets": 50, "description": "Decode count" }, + "IMAGE_ANIMATED_DECODE_COUNT": { + "alert_emails": ["gfx-telemetry-alerts@mozilla.com"], + "bug_numbers": [1347302], + "expires_in_version": "57", + "kind": "exponential", + "high": 500, + "n_buckets": 50, + "description": "Decode count of animated images" + }, "IMAGE_DECODE_SPEED_JPEG": { "expires_in_version": "never", "kind": "exponential", From 3b674cd13720efb734fdca6c74b067ac8e440959 Mon Sep 17 00:00:00 2001 From: Timothy Nikkel Date: Thu, 23 Mar 2017 00:02:54 -0500 Subject: [PATCH 211/300] Bug 1343341. Change GetTimeoutForFrame to return a Maybe, and make all callers deal with a lack of a return value. r=aosmond Do this to allow GetTimeoutForFrame to be called for frames that haven't been decoded yet. Propagate a Maybe result where it makes sense. The remaining callers just bail if they get no return value. Many of them can just assert that they get a return value because they already got the same frame, so the timeout has to be available. The logic is a little tricky because we have "Forever" timeouts that were sort of treated as error cases. --- image/FrameAnimator.cpp | 64 ++++++++++++++++++++++++++++------------- image/FrameAnimator.h | 10 ++++--- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/image/FrameAnimator.cpp b/image/FrameAnimator.cpp index a3ed0a4a69e21..736d722d7a04e 100644 --- a/image/FrameAnimator.cpp +++ b/image/FrameAnimator.cpp @@ -141,28 +141,33 @@ AnimationState::LoopLength() const // FrameAnimator implementation. /////////////////////////////////////////////////////////////////////////////// -TimeStamp +Maybe FrameAnimator::GetCurrentImgFrameEndTime(AnimationState& aState) const { TimeStamp currentFrameTime = aState.mCurrentAnimationFrameTime; - FrameTimeout timeout = GetTimeoutForFrame(aState.mCurrentAnimationFrameIndex); + Maybe timeout = GetTimeoutForFrame(aState, aState.mCurrentAnimationFrameIndex); - if (timeout == FrameTimeout::Forever()) { + if (timeout.isNothing()) { + MOZ_ASSERT(aState.GetHasBeenDecoded() && !aState.GetIsCurrentlyDecoded()); + return Nothing(); + } + + if (*timeout == FrameTimeout::Forever()) { // We need to return a sentinel value in this case, because our logic // doesn't work correctly if we have an infinitely long timeout. We use one // year in the future as the sentinel because it works with the loop in // RequestRefresh() below. // XXX(seth): It'd be preferable to make our logic work correctly with // infinitely long timeouts. - return TimeStamp::NowLoRes() + - TimeDuration::FromMilliseconds(31536000.0); + return Some(TimeStamp::NowLoRes() + + TimeDuration::FromMilliseconds(31536000.0)); } TimeDuration durationOfTimeout = - TimeDuration::FromMilliseconds(double(timeout.AsMilliseconds())); + TimeDuration::FromMilliseconds(double(timeout->AsMilliseconds())); TimeStamp currentFrameEndTime = currentFrameTime + durationOfTimeout; - return currentFrameEndTime; + return Some(currentFrameEndTime); } RefreshResult @@ -238,7 +243,11 @@ FrameAnimator::AdvanceFrame(AnimationState& aState, TimeStamp aTime) return ret; } - if (GetTimeoutForFrame(nextFrameIndex) == FrameTimeout::Forever()) { + Maybe nextFrameTimeout = GetTimeoutForFrame(aState, nextFrameIndex); + // GetTimeoutForFrame can only return none if frame doesn't exist, + // but we just got it above. + MOZ_ASSERT(nextFrameTimeout.isSome()); + if (*nextFrameTimeout == FrameTimeout::Forever()) { ret.mAnimationFinished = true; } @@ -252,7 +261,9 @@ FrameAnimator::AdvanceFrame(AnimationState& aState, TimeStamp aTime) // something went wrong, move on to next NS_WARNING("FrameAnimator::AdvanceFrame(): Compositing of frame failed"); nextFrame->SetCompositingFailed(true); - aState.mCurrentAnimationFrameTime = GetCurrentImgFrameEndTime(aState); + Maybe currentFrameEndTime = GetCurrentImgFrameEndTime(aState); + MOZ_ASSERT(currentFrameEndTime.isSome()); + aState.mCurrentAnimationFrameTime = *currentFrameEndTime; aState.mCurrentAnimationFrameIndex = nextFrameIndex; return ret; @@ -261,7 +272,9 @@ FrameAnimator::AdvanceFrame(AnimationState& aState, TimeStamp aTime) nextFrame->SetCompositingFailed(false); } - aState.mCurrentAnimationFrameTime = GetCurrentImgFrameEndTime(aState); + Maybe currentFrameEndTime = GetCurrentImgFrameEndTime(aState); + MOZ_ASSERT(currentFrameEndTime.isSome()); + aState.mCurrentAnimationFrameTime = *currentFrameEndTime; // If we can get closer to the current time by a multiple of the image's loop // time, we should. We can only do this if we're done decoding; otherwise, we @@ -301,10 +314,18 @@ FrameAnimator::RequestRefresh(AnimationState& aState, const TimeStamp& aTime) // only advance the frame if the current time is greater than or // equal to the current frame's end time. - TimeStamp currentFrameEndTime = GetCurrentImgFrameEndTime(aState); + Maybe currentFrameEndTime = GetCurrentImgFrameEndTime(aState); + if (currentFrameEndTime.isNothing()) { + MOZ_ASSERT(gfxPrefs::ImageMemAnimatedDiscardable()); + MOZ_ASSERT(aState.GetHasBeenDecoded() && !aState.GetIsCurrentlyDecoded()); + MOZ_ASSERT(aState.mCompositedFrameInvalid); + // Nothing we can do but wait for our previous current frame to be decoded + // again so we can determine what to do next. + return ret; + } - while (currentFrameEndTime <= aTime) { - TimeStamp oldFrameEndTime = currentFrameEndTime; + while (*currentFrameEndTime <= aTime) { + TimeStamp oldFrameEndTime = *currentFrameEndTime; RefreshResult frameRes = AdvanceFrame(aState, aTime); @@ -312,17 +333,19 @@ FrameAnimator::RequestRefresh(AnimationState& aState, const TimeStamp& aTime) ret.Accumulate(frameRes); currentFrameEndTime = GetCurrentImgFrameEndTime(aState); + // AdvanceFrame can't advance to a frame that doesn't exist yet. + MOZ_ASSERT(currentFrameEndTime.isSome()); // If we didn't advance a frame, and our frame end time didn't change, // then we need to break out of this loop & wait for the frame(s) // to finish downloading. - if (!frameRes.mFrameAdvanced && (currentFrameEndTime == oldFrameEndTime)) { + if (!frameRes.mFrameAdvanced && (*currentFrameEndTime == oldFrameEndTime)) { break; } } // Advanced to the correct frame, the composited frame is now valid to be drawn. - if (currentFrameEndTime > aTime) { + if (*currentFrameEndTime > aTime) { aState.mCompositedFrameInvalid = false; } @@ -371,17 +394,18 @@ FrameAnimator::GetCompositedFrame(AnimationState& aState) return result; } -FrameTimeout -FrameAnimator::GetTimeoutForFrame(uint32_t aFrameNum) const +Maybe +FrameAnimator::GetTimeoutForFrame(AnimationState& aState, + uint32_t aFrameNum) const { RawAccessFrameRef frame = GetRawFrame(aFrameNum); if (frame) { AnimationData data = frame->GetAnimationData(); - return data.mTimeout; + return Some(data.mTimeout); } - NS_WARNING("No frame; called GetTimeoutForFrame too early?"); - return FrameTimeout::FromRawMilliseconds(100); + MOZ_ASSERT(aState.mHasBeenDecoded && !aState.mIsCurrentlyDecoded); + return Nothing(); } static void diff --git a/image/FrameAnimator.h b/image/FrameAnimator.h index 998a79f66db32..2f1cbe9eaccae 100644 --- a/image/FrameAnimator.h +++ b/image/FrameAnimator.h @@ -312,15 +312,17 @@ class FrameAnimator */ RawAccessFrameRef GetRawFrame(uint32_t aFrameNum) const; - /// @return the given frame's timeout. - FrameTimeout GetTimeoutForFrame(uint32_t aFrameNum) const; + /// @return the given frame's timeout if it is available + Maybe GetTimeoutForFrame(AnimationState& aState, + uint32_t aFrameNum) const; /** * Get the time the frame we're currently displaying is supposed to end. * - * In the error case, returns an "infinity" timestamp. + * In the error case (like if the requested frame is not currently + * decoded), returns None(). */ - TimeStamp GetCurrentImgFrameEndTime(AnimationState& aState) const; + Maybe GetCurrentImgFrameEndTime(AnimationState& aState) const; bool DoBlend(gfx::IntRect* aDirtyRect, uint32_t aPrevFrameIndex, From 4a9ecc9a36960b18a3545a6d85e0c2a31cb27d31 Mon Sep 17 00:00:00 2001 From: Mason Chang Date: Wed, 22 Mar 2017 22:04:00 -0700 Subject: [PATCH 212/300] Bug 1348584 Default to 1.0 contrast for Skia backends if custom contrast dwrite param isn't supported by skia. r=emk --- gfx/thebes/gfxWindowsPlatform.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp index 7ad26449ae191..1410fb0402985 100755 --- a/gfx/thebes/gfxWindowsPlatform.cpp +++ b/gfx/thebes/gfxWindowsPlatform.cpp @@ -1217,6 +1217,14 @@ gfxWindowsPlatform::SetupClearTypeParams() } } + if (GetDefaultContentBackend() == BackendType::SKIA) { + // Skia doesn't support a contrast value outside of 0-1, so default to 1.0 + if (contrast < 0.0 || contrast > 1.0) { + NS_WARNING("Custom dwrite contrast not supported in Skia. Defaulting to 1.0."); + contrast = 1.0; + } + } + // For parameters that have not been explicitly set, // we copy values from default params (or our overridden value for contrast) if (gamma < 1.0 || gamma > 2.2) { From f57c72b33688e9821f0feb4ba809af081e575001 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Thu, 23 Mar 2017 07:19:55 +0100 Subject: [PATCH 213/300] Bug 1349572 - FileSystemSync must be able to work also with non nsISeekableStream, r=smaug --- dom/workers/FileReaderSync.cpp | 46 +++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/dom/workers/FileReaderSync.cpp b/dom/workers/FileReaderSync.cpp index 18efcb194c71c..3d855aef9fd0e 100644 --- a/dom/workers/FileReaderSync.cpp +++ b/dom/workers/FileReaderSync.cpp @@ -20,7 +20,8 @@ #include "nsError.h" #include "nsIConverterInputStream.h" #include "nsIInputStream.h" -#include "nsISeekableStream.h" +#include "nsIMultiplexInputStream.h" +#include "nsStringStream.h" #include "nsISupportsImpl.h" #include "nsNetUtil.h" #include "nsServiceManagerUtils.h" @@ -133,17 +134,23 @@ FileReaderSync::ReadAsText(Blob& aBlob, } nsAutoCString encoding; - unsigned char sniffBuf[3] = { 0, 0, 0 }; - uint32_t numRead; - aRv = stream->Read(reinterpret_cast(sniffBuf), - sizeof(sniffBuf), &numRead); + + nsAutoCString sniffBuf; + if (!sniffBuf.SetLength(3, fallible)) { + aRv.Throw(NS_ERROR_OUT_OF_MEMORY); + return; + } + + uint32_t numRead = 0; + aRv = stream->Read(sniffBuf.BeginWriting(), sniffBuf.Length(), &numRead); if (NS_WARN_IF(aRv.Failed())) { return; } // The BOM sniffing is baked into the "decode" part of the Encoding // Standard, which the File API references. - if (!nsContentUtils::CheckForBOM(sniffBuf, numRead, encoding)) { + if (!nsContentUtils::CheckForBOM((const unsigned char*)sniffBuf.BeginReading(), + numRead, encoding)) { // BOM sniffing failed. Try the API argument. if (!aEncoding.WasPassed() || !EncodingUtils::FindEncodingForLabel(aEncoding.Value(), @@ -167,20 +174,35 @@ FileReaderSync::ReadAsText(Blob& aBlob, } } - nsCOMPtr seekable = do_QueryInterface(stream); - if (!seekable) { + // Let's recreate the full stream using a: + // multiplexStream(stringStream + original stream) + // In theory, we could try to see if the inputStream is a nsISeekableStream, + // but this doesn't work correctly for nsPipe3 - See bug 1349570. + + nsCOMPtr stringStream; + aRv = NS_NewCStringInputStream(getter_AddRefs(stringStream), sniffBuf); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + nsCOMPtr multiplexStream = + do_CreateInstance("@mozilla.org/io/multiplex-input-stream;1"); + if (NS_WARN_IF(!multiplexStream)) { aRv.Throw(NS_ERROR_FAILURE); return; } - // Seek to 0 because to undo the BOM sniffing advance. UTF-8 and UTF-16 - // decoders will swallow the BOM. - aRv = seekable->Seek(nsISeekableStream::NS_SEEK_SET, 0); + aRv = multiplexStream->AppendStream(stringStream); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + aRv = multiplexStream->AppendStream(stream); if (NS_WARN_IF(aRv.Failed())) { return; } - aRv = ConvertStream(stream, encoding.get(), aResult); + aRv = ConvertStream(multiplexStream, encoding.get(), aResult); if (NS_WARN_IF(aRv.Failed())) { return; } From 60d1a1803e36871b62414c5e7149c44539870f79 Mon Sep 17 00:00:00 2001 From: Cervantes Yu Date: Wed, 15 Mar 2017 18:20:30 +0800 Subject: [PATCH 214/300] Bug 1320134 - Part 1: Tracking TLS allocations for diagnosing out-of-TLS-slots crashes on Windows. r=froydnj This tracks TlsAlloc() and TlsFree() calls on Windows for diagnosing crashes when a proces reaches its limit (1088) for TLS slots. Tracking of TLS allocation is done by intercepting TlsAlloc() and TlsFree() in kernel32.dll. After initialization, we start tracking the number of allocated TLS slots. If the number of observed TLS allocations exceeds a high water mark, we record the stack when TlsAlloc() is called, and the recorded stacks gets serialized in a JSON string ready for crash annotation. MozReview-Commit-ID: 5fHVr0eiMy5 --- xpcom/build/TlsAllocationTracker.cpp | 251 +++++++++++++++++++++++++++ xpcom/build/TlsAllocationTracker.h | 27 +++ xpcom/build/moz.build | 2 + 3 files changed, 280 insertions(+) create mode 100644 xpcom/build/TlsAllocationTracker.cpp create mode 100644 xpcom/build/TlsAllocationTracker.h diff --git a/xpcom/build/TlsAllocationTracker.cpp b/xpcom/build/TlsAllocationTracker.cpp new file mode 100644 index 0000000000000..5ba031bf0a94c --- /dev/null +++ b/xpcom/build/TlsAllocationTracker.cpp @@ -0,0 +1,251 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "TlsAllocationTracker.h" + +#include + +#include + +#include "mozilla/Atomics.h" +#include "mozilla/JSONWriter.h" +#include "mozilla/Move.h" +#include "mozilla/StackWalk.h" +#include "mozilla/StaticMutex.h" +#include "mozilla/StaticPtr.h" + +#include "nsDebug.h" +#include "nsHashKeys.h" +#include "nsString.h" +#include "nsTArray.h" +#include "nsTHashtable.h" +#include "nsWindowsDllInterceptor.h" + +namespace mozilla { +namespace { + +static StaticAutoPtr sTlsAllocationStacks; + +struct nsCStringWriter : public JSONWriteFunc { + explicit nsCStringWriter(nsCString* aData) + : mData(aData) + { + MOZ_ASSERT(mData); + } + + void Write(const char* aStr) + { + mData->AppendASCII(aStr); + } + + nsCString* mData; +}; + +// Start recording TlsAlloc() call stacks when we observed kStartTrackingTlsAt +// allocations. We choose this value close to the maximum number of TLS indexes +// in a Windows process, which is 1088, in the hope of catching TLS leaks +// without impacting normal users. +const uint32_t kStartTrackingTlsAt = 950; + +using stack_t = nsTArray; + +struct StackEntry : public nsUint32HashKey { + explicit StackEntry(KeyTypePointer aKey) + : nsUint32HashKey(aKey) + { } + + stack_t mStack; +}; + +using stacks_t = nsTHashtable; + +static StaticAutoPtr sRecentTlsAllocationStacks; + +static Atomic sInitialized; +static StaticMutex sMutex; +static Atomic sCurrentTlsSlots{0}; + +using TlsAllocFn = DWORD (WINAPI *)(); +using TlsFreeFn = BOOL (WINAPI *)(DWORD); + +TlsAllocFn gOriginalTlsAlloc; +TlsFreeFn gOriginalTlsFree; + +static void +MaybeRecordCurrentStack(DWORD aTlsIndex) +{ + if (sCurrentTlsSlots < kStartTrackingTlsAt) { + return; + } + + stack_t rawStack; + auto callback = [](uint32_t, void* aPC, void*, void* aClosure) { + auto stack = static_cast(aClosure); + stack->AppendElement(reinterpret_cast(aPC)); + }; + MozStackWalk(callback, /* skip 2 frames */ 2, + /* maxFrames */ 0, &rawStack, 0, nullptr); + + StaticMutexAutoLock lock(sMutex); + if (!sRecentTlsAllocationStacks) { + return; + } + + StackEntry* stack = sRecentTlsAllocationStacks->PutEntry(aTlsIndex); + + MOZ_ASSERT(!stack->mStack.IsEmpty()); + stack->mStack = Move(rawStack); +} + +static void +MaybeDeleteRecordedStack(DWORD aTlsIndex) +{ + StaticMutexAutoLock lock(sMutex); + if (!sRecentTlsAllocationStacks) { + return; + } + + auto entry = sRecentTlsAllocationStacks->GetEntry(aTlsIndex); + if (entry) { + sRecentTlsAllocationStacks->RemoveEntry(aTlsIndex); + } +} + + +static void +AnnotateRecentTlsStacks() +{ + StaticMutexAutoLock lock(sMutex); + if (!sRecentTlsAllocationStacks) { + // Maybe another thread steals the stack vector content and is dumping the + // stacks + return; + } + + // Move the content to prevent further requests to this function. + UniquePtr stacks = MakeUnique(); + sRecentTlsAllocationStacks->SwapElements(*stacks.get()); + sRecentTlsAllocationStacks = nullptr; + + sTlsAllocationStacks = new nsCString(); + JSONWriter output( + MakeUnique(sTlsAllocationStacks.get())); + + output.Start(JSONWriter::SingleLineStyle); + for (auto iter = stacks->Iter(); !iter.Done(); iter.Next()) { + const stack_t& stack = iter.Get()->mStack; + + output.StartArrayElement(); + for (auto pc : stack) { + output.IntElement(pc); + } + output.EndArray(); + } + output.End(); +} + +DWORD WINAPI +InterposedTlsAlloc() +{ + if (!sInitialized) { + // Don't interpose if we didn't fully initialize both hooks or after we + // already shutdown the tracker. + return gOriginalTlsAlloc(); + } + + sCurrentTlsSlots += 1; + + DWORD tlsAllocRv = gOriginalTlsAlloc(); + + MaybeRecordCurrentStack(tlsAllocRv); + + if (tlsAllocRv == TLS_OUT_OF_INDEXES) { + AnnotateRecentTlsStacks(); + } + + return tlsAllocRv; +} + +BOOL WINAPI +InterposedTlsFree(DWORD aTlsIndex) +{ + if (!sInitialized) { + // Don't interpose if we didn't fully initialize both hooks or after we + // already shutdown the tracker. + return gOriginalTlsFree(aTlsIndex); + } + + sCurrentTlsSlots -= 1; + + MaybeDeleteRecordedStack(aTlsIndex); + + return gOriginalTlsFree(aTlsIndex); +} + +} // Anonymous namespace. + +void +InitTlsAllocationTracker() +{ + if (sInitialized) { + return; + } + + sRecentTlsAllocationStacks = new stacks_t(); + + // Windows DLL interceptor + static WindowsDllInterceptor sKernel32DllInterceptor{}; + + // Initialize dll interceptor and add hook. + sKernel32DllInterceptor.Init("kernel32.dll"); + bool succeeded = sKernel32DllInterceptor.AddHook( + "TlsAlloc", + reinterpret_cast(InterposedTlsAlloc), + reinterpret_cast(&gOriginalTlsAlloc)); + + if (!succeeded) { + return; + } + + succeeded = sKernel32DllInterceptor.AddHook( + "TlsFree", + reinterpret_cast(InterposedTlsFree), + reinterpret_cast(&gOriginalTlsFree)); + + if (!succeeded) { + return; + } + + sInitialized = true; +} + +const char* +GetTlsAllocationStacks() +{ + StaticMutexAutoLock lock(sMutex); + + if (!sTlsAllocationStacks) { + return nullptr; + } + + return sTlsAllocationStacks->BeginReading(); +} + +void +ShutdownTlsAllocationTracker() +{ + if (!sInitialized) { + return; + } + sInitialized = false; + + StaticMutexAutoLock lock(sMutex); + + sRecentTlsAllocationStacks = nullptr; + sTlsAllocationStacks = nullptr; +} + +} // namespace mozilla diff --git a/xpcom/build/TlsAllocationTracker.h b/xpcom/build/TlsAllocationTracker.h new file mode 100644 index 0000000000000..7476ad4c7f36f --- /dev/null +++ b/xpcom/build/TlsAllocationTracker.h @@ -0,0 +1,27 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_TlsAllocationTracker_h +#define mozilla_TlsAllocationTracker_h + +#include + +#include "mozilla/Types.h" + +namespace mozilla { + +void +InitTlsAllocationTracker(); + +const char* +GetTlsAllocationStacks(); + +void +ShutdownTlsAllocationTracker(); + +} + +#endif diff --git a/xpcom/build/moz.build b/xpcom/build/moz.build index b84d4340a8fa3..5f0a9752e6985 100644 --- a/xpcom/build/moz.build +++ b/xpcom/build/moz.build @@ -22,6 +22,7 @@ EXPORTS.mozilla += [ 'PoisonIOInterposer.h', 'ServiceList.h', 'Services.h', + 'TlsAllocationTracker.h', 'XPCOM.h', 'XREAppData.h', ] @@ -33,6 +34,7 @@ if CONFIG['OS_ARCH'] == 'WINNT': 'perfprobe.cpp', 'PoisonIOInterposerBase.cpp', 'PoisonIOInterposerWin.cpp', + 'TlsAllocationTracker.cpp', ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': UNIFIED_SOURCES += [ From 592d61fd4be935fed0721ce04ec877e1876869b8 Mon Sep 17 00:00:00 2001 From: Cervantes Yu Date: Thu, 16 Mar 2017 14:06:35 +0800 Subject: [PATCH 215/300] Bug 1320134 - Part 2: Initialize and shutdown the TLS allocation tracker in the content process. r=froydnj MozReview-Commit-ID: 2Pu9r1MV1e4 --- toolkit/xre/nsEmbedFunctions.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/toolkit/xre/nsEmbedFunctions.cpp b/toolkit/xre/nsEmbedFunctions.cpp index 578d67db3bd08..c4fc4819e4c6d 100644 --- a/toolkit/xre/nsEmbedFunctions.cpp +++ b/toolkit/xre/nsEmbedFunctions.cpp @@ -25,6 +25,7 @@ #ifdef XP_WIN #include #include "mozilla/ipc/WindowsMessageLoop.h" +#include "mozilla/TlsAllocationTracker.h" #endif #include "nsAppDirectoryServiceDefs.h" @@ -358,6 +359,14 @@ XRE_InitChildProcess(int aArgc, #endif #if defined(XP_WIN) +#ifndef DEBUG + // XXX Bug 1320134: added for diagnosing the crashes because we're running out + // of TLS indices on Windows. Remove after the root cause is found. + if (XRE_GetProcessType() == GeckoProcessType_Content) { + mozilla::InitTlsAllocationTracker(); + } +#endif + // From the --attach-console support in nsNativeAppSupportWin.cpp, but // here we are a content child process, so we always attempt to attach // to the parent's (ie, the browser's) console. @@ -697,6 +706,14 @@ XRE_InitChildProcess(int aArgc, } } +#if defined(XP_WIN) && !defined(DEBUG) + // XXX Bug 1320134: added for diagnosing the crashes because we're running out + // of TLS indices on Windows. Remove after the root cause is found. + if (XRE_GetProcessType() == GeckoProcessType_Content) { + mozilla::ShutdownTlsAllocationTracker(); + } +#endif + Telemetry::DestroyStatisticsRecorder(); return XRE_DeinitCommandLine(); } From 3aa3c7fa35c92054b8425a5af9d2bf32059b90aa Mon Sep 17 00:00:00 2001 From: Cervantes Yu Date: Thu, 23 Feb 2017 16:46:27 +0800 Subject: [PATCH 216/300] Bug 1320134 - Part 3: Annotate the crash report with TLS allocation stacks on running out of TLS slots. r=ted MozReview-Commit-ID: 9BEe4G28Txd --- toolkit/crashreporter/nsExceptionHandler.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/toolkit/crashreporter/nsExceptionHandler.cpp b/toolkit/crashreporter/nsExceptionHandler.cpp index 3dfe4c60763d5..cdba494f180e2 100644 --- a/toolkit/crashreporter/nsExceptionHandler.cpp +++ b/toolkit/crashreporter/nsExceptionHandler.cpp @@ -24,6 +24,10 @@ #include "nsXULAppAPI.h" #include "jsfriendapi.h" +#ifdef XP_WIN +#include "mozilla/TlsAllocationTracker.h" +#endif + #if defined(XP_WIN32) #ifdef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN @@ -1385,6 +1389,13 @@ PrepareChildExceptionTimeAnnotations() WriteAnnotation(apiData, "TopPendingIPCType", topPendingIPCTypeBuffer); } } + +#ifdef XP_WIN + const char* tlsAllocations = mozilla::GetTlsAllocationStacks(); + if (tlsAllocations) { + WriteAnnotation(apiData, "TlsAllocations", tlsAllocations); + } +#endif } #ifdef XP_WIN From 3fd1fe6350cd279f2fce0837f54132ba5f111e95 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Wed, 22 Mar 2017 23:38:19 +0300 Subject: [PATCH 217/300] Bug 1344853 - Enable flake8 rule E127: "continuation line over-indented for visual indent". r=Dexter MozReview-Commit-ID: HdEe1UCeKOh --- toolkit/components/telemetry/.flake8 | 2 +- .../components/telemetry/gen-event-data.py | 22 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/toolkit/components/telemetry/.flake8 b/toolkit/components/telemetry/.flake8 index 9d7729f124d80..6b6ec2449a551 100644 --- a/toolkit/components/telemetry/.flake8 +++ b/toolkit/components/telemetry/.flake8 @@ -1,5 +1,5 @@ [flake8] # See http://pep8.readthedocs.io/en/latest/intro.html#configuration -ignore = E121, E123, E126, E129, E133, E226, E241, E242, E704, W503, E402, E501, E202, E127, W601 +ignore = E121, E123, E126, E129, E133, E226, E241, E242, E704, W503, E402, E501, E202, W601 max-line-length = 99 filename = *.py, +.lint diff --git a/toolkit/components/telemetry/gen-event-data.py b/toolkit/components/telemetry/gen-event-data.py index 43aee673191ce..ad43cbfca327a 100644 --- a/toolkit/components/telemetry/gen-event-data.py +++ b/toolkit/components/telemetry/gen-event-data.py @@ -75,13 +75,13 @@ def write_common_event_table(events, output, string_table, extra_table): # Write the common info structure print(" {%d, %d, %d, %d, %d, %s, %s}," % - (string_table.stringIndex(e.category), - string_table.stringIndex(e.expiry_version), - extras[0], # extra keys index - extras[1], # extra keys count - e.expiry_day, - e.dataset, - " | ".join(e.record_in_processes_enum)), + (string_table.stringIndex(e.category), + string_table.stringIndex(e.expiry_version), + extras[0], # extra keys index + extras[1], # extra keys count + e.expiry_day, + e.dataset, + " | ".join(e.record_in_processes_enum)), file=output) print("};", file=output) @@ -96,13 +96,13 @@ def write_event_table(events, output, string_table): for common_info_index, e in enumerate(events): for method_name, object_name in itertools.product(e.methods, e.objects): print(" // category: %s, method: %s, object: %s" % - (e.category, method_name, object_name), + (e.category, method_name, object_name), file=output) print(" {gCommonEventInfo[%d], %d, %d}," % - (common_info_index, - string_table.stringIndex(method_name), - string_table.stringIndex(object_name)), + (common_info_index, + string_table.stringIndex(method_name), + string_table.stringIndex(object_name)), file=output) print("};", file=output) From d61f48ace1c09e87f6482e874dffdfb826649819 Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 10 Mar 2017 14:13:07 +0800 Subject: [PATCH 218/300] Bug 1333003 part 1 - Add Windows x64 ASan mozconfigs to the tree. r=mshal MozReview-Commit-ID: KuXcyL6yqH7 --- browser/config/mozconfigs/win64/debug-asan | 17 ++++++++++++++ browser/config/mozconfigs/win64/nightly-asan | 17 ++++++++++++++ build/win64/mozconfig.asan | 24 ++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 browser/config/mozconfigs/win64/debug-asan create mode 100644 browser/config/mozconfigs/win64/nightly-asan create mode 100644 build/win64/mozconfig.asan diff --git a/browser/config/mozconfigs/win64/debug-asan b/browser/config/mozconfigs/win64/debug-asan new file mode 100644 index 0000000000000..3fb3eb17be214 --- /dev/null +++ b/browser/config/mozconfigs/win64/debug-asan @@ -0,0 +1,17 @@ +MOZ_AUTOMATION_L10N_CHECK=0 + +. "$topsrcdir/build/mozconfig.win-common" +. "$topsrcdir/browser/config/mozconfigs/common" + +ac_add_options --enable-debug +ac_add_options --enable-optimize="-O1" + +. "$topsrcdir/build/win64/mozconfig.vs-latest" + +. "$topsrcdir/build/win64/mozconfig.asan" + +export MOZ_PACKAGE_JSSHELL=1 +export MOZ_PKG_SPECIAL=asan + +. "$topsrcdir/build/mozconfig.common.override" +. "$topsrcdir/build/mozconfig.cache" diff --git a/browser/config/mozconfigs/win64/nightly-asan b/browser/config/mozconfigs/win64/nightly-asan new file mode 100644 index 0000000000000..478d5581b77fa --- /dev/null +++ b/browser/config/mozconfigs/win64/nightly-asan @@ -0,0 +1,17 @@ +MOZ_AUTOMATION_L10N_CHECK=0 + +. "$topsrcdir/build/mozconfig.win-common" +. "$topsrcdir/browser/config/mozconfigs/common" + +ac_add_options --disable-debug +ac_add_options --enable-optimize="-O2 -gline-tables-only" + +. "$topsrcdir/build/win64/mozconfig.vs-latest" + +. "$topsrcdir/build/win64/mozconfig.asan" + +export MOZ_PACKAGE_JSSHELL=1 +export MOZ_PKG_SPECIAL=asan + +. "$topsrcdir/build/mozconfig.common.override" +. "$topsrcdir/build/mozconfig.cache" diff --git a/build/win64/mozconfig.asan b/build/win64/mozconfig.asan new file mode 100644 index 0000000000000..533216a670dec --- /dev/null +++ b/build/win64/mozconfig.asan @@ -0,0 +1,24 @@ +ac_add_options --target=x86_64-pc-mingw32 +ac_add_options --host=x86_64-pc-mingw32 + +CLANG_LIB_DIR="$(cd $topsrcdir/clang/lib/clang/* && cd lib/windows && pwd)" + +export LIB=$LIB:$CLANG_LIB_DIR +mk_export_correct_style LIB +export LDFLAGS="clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib" + +export LLVM_SYMBOLIZER="$topsrcdir/clang/bin/llvm-symbolizer.exe" +export MOZ_CLANG_RT_ASAN_LIB_PATH="${CLANG_LIB_DIR}/clang_rt.asan_dynamic-x86_64.dll" + +# Enable ASan specific code and build workarounds +ac_add_options --enable-address-sanitizer + +# Mandatory options required for ASan builds +ac_add_options --enable-debug-symbols +ac_add_options --disable-install-strip +ac_add_options --disable-jemalloc +ac_add_options --disable-crashreporter +ac_add_options --disable-profiling + +. "$topsrcdir/build/mozconfig.vs-common" +. "$topsrcdir/build/mozconfig.clang-cl" From d5c2576089eed7799abce95a0937db2c1980cd76 Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 10 Mar 2017 12:03:05 +0800 Subject: [PATCH 219/300] Bug 1333003 part 2 - Enable ASan builds and tests on Windows x64. r=dustin MozReview-Commit-ID: GEYKhhuTNRD --- taskcluster/ci/build/windows.yml | 40 +++++++++++++++++++ taskcluster/ci/test/test-platforms.yml | 5 +++ .../transforms/gecko_v2_whitelist.py | 2 + taskcluster/taskgraph/transforms/tests.py | 7 +++- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/taskcluster/ci/build/windows.yml b/taskcluster/ci/build/windows.yml index e581a18cae7de..8b1082a9353b8 100644 --- a/taskcluster/ci/build/windows.yml +++ b/taskcluster/ci/build/windows.yml @@ -235,3 +235,43 @@ win32-qr/opt: config: - builds/taskcluster_firefox_win32_qr_opt.py run-on-projects: [ 'graphics' ] + +win64-asan/debug: + description: "Win64 Debug ASAN" + index: + product: firefox + job-name: win64-asan-debug + treeherder: + platform: windows2012-64/asan + symbol: tc(Bd) + tier: 3 + worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 + worker: + implementation: generic-worker + max-run-time: 7200 + run: + using: mozharness + script: mozharness/scripts/fx_desktop_build.py + config: + - builds/taskcluster_firefox_win64_asan_debug.py + run-on-projects: [] + +win64-asan/opt: + description: "Win64 Opt ASAN" + index: + product: firefox + job-name: win64-asan-opt + treeherder: + platform: windows2012-64/asan + symbol: tc(Bo) + tier: 3 + worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 + worker: + implementation: generic-worker + max-run-time: 7200 + run: + using: mozharness + script: mozharness/scripts/fx_desktop_build.py + config: + - builds/taskcluster_firefox_win64_asan_opt.py + run-on-projects: [] \ No newline at end of file diff --git a/taskcluster/ci/test/test-platforms.yml b/taskcluster/ci/test/test-platforms.yml index c4fffd0c454d0..f86109eee02da 100644 --- a/taskcluster/ci/test/test-platforms.yml +++ b/taskcluster/ci/test/test-platforms.yml @@ -150,6 +150,11 @@ windows10-64-vm/opt: # test-sets: # - windows-gpu-tests +windows10-64-asan/opt: + build-platform: win64-asan/opt + test-sets: + - common-tests + ## # MacOS X platforms (matching /macosx.*/) diff --git a/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py b/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py index dc52a3ac964d7..6801cb3e29f17 100644 --- a/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py +++ b/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py @@ -84,6 +84,8 @@ 'win64-st-an-opt', 'win64-qr-debug', 'win64-qr-opt', + 'win64-asan-debug', + 'win64-asan-opt', ]) JOB_NAME_WHITELIST_ERROR = """\ diff --git a/taskcluster/taskgraph/transforms/tests.py b/taskcluster/taskgraph/transforms/tests.py index 2519c8d963269..ecafbaf98a02c 100644 --- a/taskcluster/taskgraph/transforms/tests.py +++ b/taskcluster/taskgraph/transforms/tests.py @@ -46,7 +46,8 @@ 'windows7-32-vm': 'aws-provisioner-v1/gecko-t-win7-32', 'windows7-32': 'aws-provisioner-v1/gecko-t-win7-32-gpu', 'windows10-64-vm': 'aws-provisioner-v1/gecko-t-win10-64', - 'windows10-64': 'aws-provisioner-v1/gecko-t-win10-64-gpu' + 'windows10-64': 'aws-provisioner-v1/gecko-t-win10-64-gpu', + 'windows10-64-asan': 'aws-provisioner-v1/gecko-t-win10-64-gpu' } logger = logging.getLogger(__name__) @@ -356,6 +357,7 @@ def set_treeherder_machine_platform(config, tests): 'linux64-pgo/opt': 'linux64/pgo', 'macosx64/debug': 'osx-10-10/debug', 'macosx64/opt': 'osx-10-10/opt', + 'win64-asan/opt': 'windows10-64/asan', # The build names for Android platforms have partially evolved over the # years and need to be translated. 'android-api-15/debug': 'android-4-3-armv7-api15/debug', @@ -449,7 +451,8 @@ def set_download_symbols(config, tests): for test in tests: if test['test-platform'].split('/')[-1] == 'debug': test['mozharness']['download-symbols'] = True - elif test['build-platform'] == 'linux64-asan/opt': + elif test['build-platform'] == 'linux64-asan/opt' or \ + test['build-platform'] == 'windows10-64-asan/opt': if 'download-symbols' in test['mozharness']: del test['mozharness']['download-symbols'] else: From 14708ab43cb18a7252377c252ef75ca66ea53b70 Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 10 Mar 2017 14:15:22 +0800 Subject: [PATCH 220/300] Bug 1333003 part 3 - Add mozharness configs for Windows x64 ASan build jobs. r=grenade MozReview-Commit-ID: 7Ng6uwPMl9m --- .../taskcluster_firefox_win64_asan_debug.py | 91 +++++++++++++++++++ .../taskcluster_firefox_win64_asan_opt.py | 89 ++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py create mode 100644 testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py diff --git a/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py b/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py new file mode 100644 index 0000000000000..97f712c8cca32 --- /dev/null +++ b/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py @@ -0,0 +1,91 @@ +import os +import sys + +config = { + ######################################################################### + ######## WINDOWS GENERIC CONFIG KEYS/VAlUES + # if you are updating this with custom 64 bit keys/values please add them + # below under the '64 bit specific' code block otherwise, update in this + # code block and also make sure this is synced between: + # - taskcluster_firefox_win32_debug + # - taskcluster_firefox_win32_opt + # - taskcluster_firefox_win64_debug + # - taskcluster_firefox_win64_opt + # - taskcluster_firefox_win32_clang + # - taskcluster_firefox_win32_clang_debug + # - taskcluster_firefox_win64_clang + # - taskcluster_firefox_win64_clang_debug + + 'default_actions': [ + 'clone-tools', + 'build', + 'check-test', + ], + 'exes': { + 'python2.7': sys.executable, + 'make': [ + sys.executable, + os.path.join( + os.getcwd(), 'build', 'src', 'build', 'pymake', 'make.py' + ) + ], + 'virtualenv': [ + sys.executable, + os.path.join( + os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py' + ) + ], + 'mach-build': [ + os.path.join(os.environ['MOZILLABUILD'], 'msys', 'bin', 'bash.exe'), + os.path.join(os.getcwd(), 'build', 'src', 'mach'), + '--log-no-times', 'build', '-v' + ], + }, + 'app_ini_path': '%(obj_dir)s/dist/bin/application.ini', + # decides whether we want to use moz_sign_cmd in env + 'enable_signing': True, + 'enable_ccache': False, + 'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'), + 'objdir': 'obj-firefox', + 'tooltool_script': [ + sys.executable, + os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py') + ], + 'tooltool_bootstrap': 'setup.sh', + 'enable_count_ctors': False, + 'max_build_output_timeout': 60 * 80, + ######################################################################### + + + ######################################################################### + ###### 64 bit specific ###### + 'base_name': 'WINNT_6.1_x86-64_%(branch)s', + 'platform': 'win64', + 'stage_platform': 'win64-asan-debug', + 'debug_build': True, + 'publish_nightly_en_US_routes': True, + 'env': { + 'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'), + 'MOZ_AUTOMATION': '1', + 'MOZ_CRASHREPORTER_NO_REPORT': '1', + 'MOZ_OBJDIR': 'obj-firefox', + 'PDBSTR_PATH': '/c/Program Files (x86)/Windows Kits/10/Debuggers/x64/srcsrv/pdbstr.exe', + 'TINDERBOX_OUTPUT': '1', + 'TOOLTOOL_CACHE': '/c/builds/tooltool_cache', + 'TOOLTOOL_HOME': '/c/builds', + 'XPCOM_DEBUG_BREAK': 'stack-and-abort', + 'MSYSTEM': 'MINGW32', + }, + 'upload_env': { + 'UPLOAD_HOST': 'localhost', + 'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'), + }, + "check_test_env": { + 'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win64\\minidump_stackwalk.exe', + 'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps', + }, + 'enable_pymake': True, + 'src_mozconfig': 'browser\\config\\mozconfigs\\win64\\debug-asan', + 'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win64\\clang.manifest', + ######################################################################### +} diff --git a/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py b/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py new file mode 100644 index 0000000000000..d1d79b460b95f --- /dev/null +++ b/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py @@ -0,0 +1,89 @@ +import os +import sys + +config = { + ######################################################################### + ######## WINDOWS GENERIC CONFIG KEYS/VAlUES + # if you are updating this with custom 64 bit keys/values please add them + # below under the '64 bit specific' code block otherwise, update in this + # code block and also make sure this is synced between: + # - taskcluster_firefox_win32_debug + # - taskcluster_firefox_win32_opt + # - taskcluster_firefox_win64_debug + # - taskcluster_firefox_win64_opt + # - taskcluster_firefox_win32_clang + # - taskcluster_firefox_win32_clang_debug + # - taskcluster_firefox_win64_clang + # - taskcluster_firefox_win64_clang_debug + + 'default_actions': [ + 'clone-tools', + 'build', + 'check-test', + ], + 'exes': { + 'python2.7': sys.executable, + 'make': [ + sys.executable, + os.path.join( + os.getcwd(), 'build', 'src', 'build', 'pymake', 'make.py' + ) + ], + 'virtualenv': [ + sys.executable, + os.path.join( + os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py' + ) + ], + 'mach-build': [ + os.path.join(os.environ['MOZILLABUILD'], 'msys', 'bin', 'bash.exe'), + os.path.join(os.getcwd(), 'build', 'src', 'mach'), + '--log-no-times', 'build', '-v' + ], + }, + 'app_ini_path': '%(obj_dir)s/dist/bin/application.ini', + # decides whether we want to use moz_sign_cmd in env + 'enable_signing': True, + 'enable_ccache': False, + 'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'), + 'objdir': 'obj-firefox', + 'tooltool_script': [ + sys.executable, + os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py') + ], + 'tooltool_bootstrap': 'setup.sh', + 'enable_count_ctors': False, + 'max_build_output_timeout': 60 * 80, + ######################################################################### + + + ######################################################################### + ###### 64 bit specific ###### + 'base_name': 'WINNT_6.1_x86-64_%(branch)s', + 'platform': 'win64', + 'stage_platform': 'win64-asan', + 'publish_nightly_en_US_routes': True, + 'env': { + 'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'), + 'MOZ_AUTOMATION': '1', + 'MOZ_CRASHREPORTER_NO_REPORT': '1', + 'MOZ_OBJDIR': 'obj-firefox', + 'PDBSTR_PATH': '/c/Program Files (x86)/Windows Kits/10/Debuggers/x64/srcsrv/pdbstr.exe', + 'TINDERBOX_OUTPUT': '1', + 'TOOLTOOL_CACHE': '/c/builds/tooltool_cache', + 'TOOLTOOL_HOME': '/c/builds', + 'MSYSTEM': 'MINGW32', + }, + 'upload_env': { + 'UPLOAD_HOST': 'localhost', + 'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'), + }, + "check_test_env": { + 'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win64\\minidump_stackwalk.exe', + 'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps', + }, + 'enable_pymake': True, + 'src_mozconfig': 'browser\\config\\mozconfigs\\win64\\nightly-asan', + 'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win64\\clang.manifest', + ######################################################################### +} From aa8ded428cc896b0311726dcb14f4ea6afdc0cad Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 10 Mar 2017 12:24:02 +0800 Subject: [PATCH 221/300] Bug 1333003 part 4 - Package the binary of llvm-symbolizer also on Windows. r=ted MozReview-Commit-ID: 4nhVgQTJ7Bz --- browser/installer/package-manifest.in | 4 ++-- build/moz.build | 3 +++ build/unix/moz.build | 3 --- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 9a294ec2b4554..0f1488380f1e8 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -796,9 +796,9 @@ bin/libfreebl_32int64_3.so @RESPATH@/components/nsTerminatorTelemetry.js @RESPATH@/components/terminator.manifest -#if defined(CLANG_CXX) +#if defined(CLANG_CXX) || defined(CLANG_CL) #if defined(MOZ_ASAN) || defined(MOZ_TSAN) -@BINPATH@/llvm-symbolizer +@BINPATH@/llvm-symbolizer@BIN_SUFFIX@ #endif #endif diff --git a/build/moz.build b/build/moz.build index 13774b08e840e..0f7230fddc413 100644 --- a/build/moz.build +++ b/build/moz.build @@ -45,6 +45,9 @@ OBJDIR_FILES += ['!/dist/bin/.gdbinit_python'] if CONFIG['MOZ_ASAN'] and CONFIG['CLANG_CL']: FINAL_TARGET_FILES += ['%' + CONFIG['MOZ_CLANG_RT_ASAN_LIB_PATH']] +if CONFIG['LLVM_SYMBOLIZER']: + FINAL_TARGET_FILES += ['/' + CONFIG['LLVM_SYMBOLIZER']] + if CONFIG['MOZ_APP_BASENAME']: appini_defines = { 'TOPOBJDIR': TOPOBJDIR, diff --git a/build/unix/moz.build b/build/unix/moz.build index 3acc2c07aef10..95e5b92ac6c3f 100644 --- a/build/unix/moz.build +++ b/build/unix/moz.build @@ -10,9 +10,6 @@ if CONFIG['MOZ_LIBSTDCXX_TARGET_VERSION'] or CONFIG['MOZ_LIBSTDCXX_HOST_VERSION' if CONFIG['USE_ELF_HACK']: DIRS += ['elfhack'] -if CONFIG['LLVM_SYMBOLIZER']: - FINAL_TARGET_FILES += ['/' + CONFIG['LLVM_SYMBOLIZER']] - FINAL_TARGET_FILES += [ 'run-mozilla.sh', ] From 79eb21440d22928c99a894c281da8b0e9bb87530 Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 10 Mar 2017 12:09:17 +0800 Subject: [PATCH 222/300] Bug 1333003 part 5 - Include ASan runtime dll in common.tests.zip. r=ted MozReview-Commit-ID: AzPdxaWwJn4 --- python/mozbuild/mozbuild/action/test_archive.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/python/mozbuild/mozbuild/action/test_archive.py b/python/mozbuild/mozbuild/action/test_archive.py index 50369ff9173e2..9cbaa3653dd0c 100644 --- a/python/mozbuild/mozbuild/action/test_archive.py +++ b/python/mozbuild/mozbuild/action/test_archive.py @@ -450,6 +450,16 @@ } +if buildconfig.defines['MOZ_ASAN'] and buildconfig.substs['CLANG_CL']: + asan_dll = { + 'source': buildconfig.topobjdir, + 'base': 'dist/bin', + 'pattern': os.path.basename(buildconfig.substs['MOZ_CLANG_RT_ASAN_LIB_PATH']), + 'dest': 'bin' + } + ARCHIVE_FILES['common'].append(asan_dll) + + # "common" is our catch all archive and it ignores things from other archives. # Verify nothing sneaks into ARCHIVE_FILES without a corresponding exclusion # rule in the "common" archive. From 78c08fa8104410a2ded896784ec06605656cd519 Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 10 Mar 2017 12:08:34 +0800 Subject: [PATCH 223/300] Bug 1333003 part 6 - Fix test scripts to run ASan on Windows. r=ted MozReview-Commit-ID: 6F9UXgTRb2Y --- testing/gtest/rungtests.py | 4 +++- testing/mochitest/runtests.py | 4 ++-- testing/mozbase/mozrunner/mozrunner/utils.py | 13 +++++++++---- testing/runcppunittests.py | 4 +++- testing/xpcshell/runxpcshelltests.py | 4 +++- 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/testing/gtest/rungtests.py b/testing/gtest/rungtests.py index 10a9c0c5d1814..d2b9e52edcf58 100644 --- a/testing/gtest/rungtests.py +++ b/testing/gtest/rungtests.py @@ -128,7 +128,9 @@ def build_environment(self): # ASan specific environment stuff if mozinfo.info["asan"]: # Symbolizer support - llvmsym = os.path.join(self.xre_path, "llvm-symbolizer") + llvmsym = os.path.join( + self.xre_path, + "llvm-symbolizer" + mozinfo.info["bin_suffix"].encode('ascii')) if os.path.isfile(llvmsym): env["ASAN_SYMBOLIZER_PATH"] = llvmsym log.info("gtest | ASan using symbolizer at %s", llvmsym) diff --git a/testing/mochitest/runtests.py b/testing/mochitest/runtests.py index 5f718d58932ea..2f1b71b974735 100644 --- a/testing/mochitest/runtests.py +++ b/testing/mochitest/runtests.py @@ -1554,7 +1554,7 @@ def makeTestConfig(self, options): def buildBrowserEnv(self, options, debugger=False, env=None): """build the environment variables for the specific test and operating system""" - if mozinfo.info["asan"]: + if mozinfo.info["asan"] and mozinfo.isLinux and mozinfo.bits == 64: lsanPath = SCRIPT_DIR else: lsanPath = None @@ -2029,7 +2029,7 @@ def runApp(self, else: shutdownLeaks = None - if mozinfo.info["asan"] and (mozinfo.isLinux or mozinfo.isMac): + if mozinfo.info["asan"] and mozinfo.isLinux and mozinfo.bits == 64: lsanLeaks = LSANLeaks(self.log) else: lsanLeaks = None diff --git a/testing/mozbase/mozrunner/mozrunner/utils.py b/testing/mozbase/mozrunner/mozrunner/utils.py index f96c94398d1a7..850ce86825317 100755 --- a/testing/mozbase/mozrunner/mozrunner/utils.py +++ b/testing/mozbase/mozrunner/mozrunner/utils.py @@ -153,10 +153,12 @@ def test_environment(xrePath, env=None, crashreporter=True, debugger=False, # ASan specific environment stuff asan = bool(mozinfo.info.get("asan")) - if asan and (mozinfo.isLinux or mozinfo.isMac): + if asan: try: # Symbolizer support - llvmsym = os.path.join(xrePath, "llvm-symbolizer") + llvmsym = os.path.join( + xrePath, + "llvm-symbolizer" + mozinfo.info["bin_suffix"].encode('ascii')) if os.path.isfile(llvmsym): env["ASAN_SYMBOLIZER_PATH"] = llvmsym log.info("INFO | runtests.py | ASan using symbolizer at %s" @@ -166,8 +168,11 @@ def test_environment(xrePath, env=None, crashreporter=True, debugger=False, " ASan symbolizer at %s" % llvmsym) # Returns total system memory in kilobytes. - # Works only on unix-like platforms where `free` is in the path. - totalMemory = int(os.popen("free").readlines()[1].split()[1]) + if mozinfo.isWin: + totalMemory = int( + os.popen("wmic computersystem get TotalPhysicalMemory").readlines()[1]) / 1024 + else: + totalMemory = int(os.popen("free").readlines()[1].split()[1]) # Only 4 GB RAM or less available? Use custom ASan options to reduce # the amount of resources required to do the tests. Standard options diff --git a/testing/runcppunittests.py b/testing/runcppunittests.py index d8b79f68f79a9..060ce6f4e2360 100755 --- a/testing/runcppunittests.py +++ b/testing/runcppunittests.py @@ -123,7 +123,9 @@ def build_environment(self): if mozinfo.info["asan"]: # Use llvm-symbolizer for ASan if available/required - llvmsym = os.path.join(self.xre_path, "llvm-symbolizer") + llvmsym = os.path.join( + self.xre_path, + "llvm-symbolizer" + mozinfo.info["bin_suffix"].encode('ascii')) if os.path.isfile(llvmsym): env["ASAN_SYMBOLIZER_PATH"] = llvmsym self.log.info("ASan using symbolizer at %s" % llvmsym) diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py index 739c8b9f10742..e97ffe2cd5aa9 100755 --- a/testing/xpcshell/runxpcshelltests.py +++ b/testing/xpcshell/runxpcshelltests.py @@ -942,7 +942,9 @@ def buildEnvironment(self): usingTSan = "tsan" in self.mozInfo and self.mozInfo["tsan"] if usingASan or usingTSan: # symbolizer support - llvmsym = os.path.join(self.xrePath, "llvm-symbolizer") + llvmsym = os.path.join( + self.xrePath, + "llvm-symbolizer" + self.mozInfo["bin_suffix"].encode('ascii')) if os.path.isfile(llvmsym): if usingASan: self.env["ASAN_SYMBOLIZER_PATH"] = llvmsym From df96283bff77ca4b3e97de046db9bee0966092c8 Mon Sep 17 00:00:00 2001 From: Ting-Yu Chou Date: Fri, 17 Mar 2017 12:23:44 +0800 Subject: [PATCH 224/300] Bug 1333003 part 7 - Add jittest-chunked to the suites so the tests are run. r=grenade MozReview-Commit-ID: 8C5Qr4WuBTu --- .../mozharness/configs/unittests/win_taskcluster_unittest.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/testing/mozharness/configs/unittests/win_taskcluster_unittest.py b/testing/mozharness/configs/unittests/win_taskcluster_unittest.py index 152cd1f948344..f715ad44e62a6 100644 --- a/testing/mozharness/configs/unittests/win_taskcluster_unittest.py +++ b/testing/mozharness/configs/unittests/win_taskcluster_unittest.py @@ -229,7 +229,8 @@ "gtest": [] }, "all_jittest_suites": { - "jittest": [] + "jittest": [], + "jittest-chunked": [], }, "all_mozbase_suites": { "mozbase": [] From bb06e4e50c0b312e1c98cce034ae82cab4556803 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 23 Mar 2017 03:06:25 -0400 Subject: [PATCH 225/300] Bug 1348095 part 1. Remove the unused reserved slots from the XPCWN xray holder. r=bholley MozReview-Commit-ID: 5IRrE8EmL9A --- js/xpconnect/wrappers/XrayWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 0daf207897f04..6d4d565e059f3 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -201,7 +201,7 @@ XPCWrappedNativeXrayTraits::getWN(JSObject* wrapper) } const JSClass XPCWrappedNativeXrayTraits::HolderClass = { - "NativePropertyHolder", JSCLASS_HAS_RESERVED_SLOTS(2) + "NativePropertyHolder" }; From 7f141121749adbf6009b9842944c2d486bd9129d Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 23 Mar 2017 03:06:25 -0400 Subject: [PATCH 226/300] Bug 1348095 part 2. Give all the Xray holders a JSClass that has a slot for caching a prototype. r=bholley MozReview-Commit-ID: ID9vMG3iJfZ --- js/xpconnect/wrappers/XrayWrapper.cpp | 7 +++++-- js/xpconnect/wrappers/XrayWrapper.h | 12 ++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 6d4d565e059f3..42a4a4ddc3d8f 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -201,9 +201,12 @@ XPCWrappedNativeXrayTraits::getWN(JSObject* wrapper) } const JSClass XPCWrappedNativeXrayTraits::HolderClass = { - "NativePropertyHolder" + "NativePropertyHolder", JSCLASS_HAS_RESERVED_SLOTS(HOLDER_SHARED_SLOT_COUNT) }; +const JSClass XrayTraits::HolderClass = { + "XrayHolder", JSCLASS_HAS_RESERVED_SLOTS(HOLDER_SHARED_SLOT_COUNT) +}; const JSClass JSXrayTraits::HolderClass = { "JSXrayHolder", JSCLASS_HAS_RESERVED_SLOTS(SLOT_COUNT) @@ -1854,7 +1857,7 @@ DOMXrayTraits::preserveWrapper(JSObject* target) JSObject* DOMXrayTraits::createHolder(JSContext* cx, JSObject* wrapper) { - return JS_NewObjectWithGivenProto(cx, nullptr, nullptr); + return JS_NewObjectWithGivenProto(cx, &HolderClass, nullptr); } const JSClass* diff --git a/js/xpconnect/wrappers/XrayWrapper.h b/js/xpconnect/wrappers/XrayWrapper.h index 5630982c28c41..4527e3b0a1f0f 100644 --- a/js/xpconnect/wrappers/XrayWrapper.h +++ b/js/xpconnect/wrappers/XrayWrapper.h @@ -99,6 +99,12 @@ class XrayTraits JSObject* ensureExpandoObject(JSContext* cx, JS::HandleObject wrapper, JS::HandleObject target); + // Slots for holder objects. + enum { + HOLDER_SLOT_CACHED_PROTO = 0, + HOLDER_SHARED_SLOT_COUNT + }; + JSObject* getHolder(JSObject* wrapper); JSObject* ensureHolder(JSContext* cx, JS::HandleObject wrapper); virtual JSObject* createHolder(JSContext* cx, JSObject* wrapper) = 0; @@ -108,6 +114,8 @@ class XrayTraits bool cloneExpandoChain(JSContext* cx, JS::HandleObject dst, JS::HandleObject src); protected: + static const JSClass HolderClass; + // Get the JSClass we should use for our expando object. virtual const JSClass* getExpandoClass(JSContext* cx, JS::HandleObject target) const; @@ -301,7 +309,7 @@ class JSXrayTraits : public XrayTraits } enum { - SLOT_PROTOKEY = 0, + SLOT_PROTOKEY = HOLDER_SHARED_SLOT_COUNT, SLOT_ISPROTOTYPE, SLOT_CONSTRUCTOR_FOR, SLOT_COUNT @@ -421,7 +429,7 @@ class OpaqueXrayTraits : public XrayTraits virtual JSObject* createHolder(JSContext* cx, JSObject* wrapper) override { - return JS_NewObjectWithGivenProto(cx, nullptr, nullptr); + return JS_NewObjectWithGivenProto(cx, &HolderClass, nullptr); } static OpaqueXrayTraits singleton; From 3093b70b19edeb654d357d29fd745ea1ec5107f4 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 23 Mar 2017 03:06:25 -0400 Subject: [PATCH 227/300] Bug 1348095 part 3. Cache the proto of an Xray on its holder, so we don't have to keep re-wrapping it. r=bholley MozReview-Commit-ID: I78AoSB3TNW --- js/xpconnect/wrappers/XrayWrapper.cpp | 33 +++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 42a4a4ddc3d8f..45eb0ffa95c92 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -2410,16 +2410,35 @@ XrayWrapper::getPrototype(JSContext* cx, JS::HandleObject wrapper, // only if there's been a set. If there's not an expando, or the expando // slot is |undefined|, hand back the default proto, appropriately wrapped. - RootedValue v(cx); if (expando) { - JSAutoCompartment ac(cx, expando); - v = JS_GetReservedSlot(expando, JSSLOT_EXPANDO_PROTOTYPE); + RootedValue v(cx); + { // Scope for JSAutoCompartment + JSAutoCompartment ac(cx, expando); + v = JS_GetReservedSlot(expando, JSSLOT_EXPANDO_PROTOTYPE); + } + if (!v.isUndefined()) { + protop.set(v.toObjectOrNull()); + return JS_WrapObject(cx, protop); + } } - if (v.isUndefined()) - return getPrototypeHelper(cx, wrapper, target, protop); - protop.set(v.toObjectOrNull()); - return JS_WrapObject(cx, protop); + // Check our holder, and cache there if we don't have it cached already. + RootedObject holder(cx, Traits::singleton.ensureHolder(cx, wrapper)); + if (!holder) + return false; + + Value cached = js::GetReservedSlot(holder, + Traits::HOLDER_SLOT_CACHED_PROTO); + if (cached.isUndefined()) { + if (!getPrototypeHelper(cx, wrapper, target, protop)) + return false; + + js::SetReservedSlot(holder, Traits::HOLDER_SLOT_CACHED_PROTO, + ObjectOrNullValue(protop)); + } else { + protop.set(cached.toObjectOrNull()); + } + return true; } template From 87cec07957da48f86922d4e1b24da4c844b8de10 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 23 Mar 2017 03:06:25 -0400 Subject: [PATCH 228/300] Bug 1349690. Improve dangling-exception logging in AutoJSAPI::InitInternal to deal better with exceptions from a different origin. r=bholley MozReview-Commit-ID: IpvRcBC2d6k --- dom/base/ScriptSettings.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dom/base/ScriptSettings.cpp b/dom/base/ScriptSettings.cpp index a89b3419127a2..c9fa9e1f2ba91 100644 --- a/dom/base/ScriptSettings.cpp +++ b/dom/base/ScriptSettings.cpp @@ -376,6 +376,13 @@ AutoJSAPI::InitInternal(nsIGlobalObject* aGlobalObject, JSObject* aGlobal, if (exn.isObject()) { JS::Rooted exnObj(aCx, &exn.toObject()); + // Make sure we can actually read things from it. This UncheckedUwrap is + // safe because we're only getting data for a debug printf. In + // particular, we do not expose this data to anyone, which is very + // important; otherwise it could be a cross-origin information leak. + exnObj = js::UncheckedUwrap(exnObj); + JSAutoCompartment ac(aCx, exnObj); + nsAutoJSString stack, filename, name, message; int32_t line; From bac20eaa73db160988859f7fc2fb861659a301fe Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Wed, 22 Mar 2017 11:18:31 +0100 Subject: [PATCH 229/300] Bug 1345032 - Further cost reductions for ProfileBuffer::FindLastSampleOfThread. r=n.nethercote. ProfileBuffer::FindLastSampleOfThread currently involves a linear search backwards through the sample buffer. Profiling showed that to be the largest profiler cost by far, at least on Linux. Bugs 1344118 and 1344258 significantly improve the situation, collectively reducing the cost by a factor of at least 5 and often much more. But the linear search is still present and still dominant. The worst of it is that it's unnecessary: we could achieve the same by recording the start point of the most recent sample for each thread in that thread's ThreadInfo record. This patch does exactly that, adding the type ProfileBuffer::LastSample to store the start points. LastSample also includes the ID of the thread it pertains to as a read-only field, as that is needed in various places. addTag doesn't check whether we're overwriting buffer entries containing start points. Instead, FindLastSample checks whether the entry pointed to the LastSample it is given still contains a marker. --- tools/profiler/core/ProfileBuffer.cpp | 8 +++ tools/profiler/core/ProfileBuffer.h | 31 ++++++++++- tools/profiler/core/ProfileBufferEntry.cpp | 51 +++++++++++-------- tools/profiler/core/ThreadInfo.cpp | 1 + tools/profiler/core/ThreadInfo.h | 8 +++ .../profiler/core/platform-linux-android.cpp | 4 +- tools/profiler/core/platform-macos.cpp | 4 +- tools/profiler/core/platform-win32.cpp | 4 +- tools/profiler/core/platform.cpp | 3 +- 9 files changed, 84 insertions(+), 30 deletions(-) diff --git a/tools/profiler/core/ProfileBuffer.cpp b/tools/profiler/core/ProfileBuffer.cpp index 3ae360420c1a1..72604efddeb32 100644 --- a/tools/profiler/core/ProfileBuffer.cpp +++ b/tools/profiler/core/ProfileBuffer.cpp @@ -39,6 +39,14 @@ void ProfileBuffer::addTag(const ProfileBufferEntry& aTag) } } +void ProfileBuffer::addTagThreadId(LastSample& aLS) +{ + // This is the start of a sample, so make a note of its location in |aLS|. + aLS.mGeneration = mGeneration; + aLS.mPos = mWritePos; + addTag(ProfileBufferEntry::ThreadId(aLS.mThreadId)); +} + void ProfileBuffer::addStoredMarker(ProfilerMarker *aStoredMarker) { aStoredMarker->SetGeneration(mGeneration); mStoredMarkers.insert(aStoredMarker); diff --git a/tools/profiler/core/ProfileBuffer.h b/tools/profiler/core/ProfileBuffer.h index 8e7cb522edd79..56445c0d4ef43 100644 --- a/tools/profiler/core/ProfileBuffer.h +++ b/tools/profiler/core/ProfileBuffer.h @@ -19,14 +19,41 @@ class ProfileBuffer final ~ProfileBuffer(); + // LastSample is used to record the buffer location of the most recent + // sample for each thread. + struct LastSample { + explicit LastSample(int aThreadId) + : mThreadId(aThreadId) + , mGeneration(0) + , mPos(-1) + {} + + // The thread to which this LastSample pertains. + const int mThreadId; + // The profiler-buffer generation number at which the sample was created. + uint32_t mGeneration; + // And its position in the buffer, or -1 meaning "invalid". + int mPos; + }; + + // Add |aTag| to the buffer, ignoring what kind of entry it is. void addTag(const ProfileBufferEntry& aTag); + + // Add to the buffer, a sample start (ThreadId) entry, for the thread that + // |aLS| belongs to, and record the resulting generation and index in |aLS|. + void addTagThreadId(LastSample& aLS); + void StreamSamplesToJSON(SpliceableJSONWriter& aWriter, int aThreadId, double aSinceTime, JSContext* cx, UniqueStacks& aUniqueStacks); void StreamMarkersToJSON(SpliceableJSONWriter& aWriter, int aThreadId, const mozilla::TimeStamp& aStartTime, double aSinceTime, UniqueStacks& aUniqueStacks); - bool DuplicateLastSample(int aThreadId, const mozilla::TimeStamp& aStartTime); + + // Find the most recent sample for the thread denoted by |aLS| and clone it, + // patching in |aStartTime| as appropriate. + bool DuplicateLastSample(const mozilla::TimeStamp& aStartTime, + LastSample& aLS); void addStoredMarker(ProfilerMarker* aStoredMarker); @@ -38,7 +65,7 @@ class ProfileBuffer final protected: char* processDynamicTag(int readPos, int* tagsConsumed, char* tagBuff); - int FindLastSampleOfThread(int aThreadId); + int FindLastSampleOfThread(const LastSample& aLS); public: // Circular buffer 'Keep One Slot Open' implementation for simplicity diff --git a/tools/profiler/core/ProfileBufferEntry.cpp b/tools/profiler/core/ProfileBufferEntry.cpp index 802d11b21e5fb..747f9119bb9ee 100644 --- a/tools/profiler/core/ProfileBufferEntry.cpp +++ b/tools/profiler/core/ProfileBufferEntry.cpp @@ -742,40 +742,49 @@ ProfileBuffer::StreamMarkersToJSON(SpliceableJSONWriter& aWriter, } } -int ProfileBuffer::FindLastSampleOfThread(int aThreadId) +int +ProfileBuffer::FindLastSampleOfThread(const LastSample& aLS) { - // We search backwards from mWritePos-1 to mReadPos. - // Adding mEntrySize makes the result of the modulus positive. - int currPos = (mWritePos + mEntrySize - 1) % mEntrySize; - int stopPos = (mReadPos + mEntrySize - 1) % mEntrySize; - while (currPos != stopPos) { - ProfileBufferEntry entry = mEntries[currPos]; - if (entry.isThreadId() && entry.mTagInt == aThreadId) { - return currPos; - } - currPos--; - if (currPos < 0) { - // This almost never happens, so is perfectly predicted, and hence - // almost free. - currPos = mEntrySize - 1; + // |aLS| has a valid generation number if either it matches the buffer's + // generation, or is one behind the buffer's generation, since the buffer's + // generation is incremented on wraparound. There's no ambiguity relative to + // ProfileBuffer::reset, since that increments mGeneration by two. + if (aLS.mGeneration == mGeneration || + (mGeneration > 0 && aLS.mGeneration == mGeneration - 1)) { + int ix = aLS.mPos; + + if (ix == -1) { + // There's no record of |aLS|'s thread ever having recorded a sample in + // the buffer. + return -1; } + + // It might be that the sample has since been overwritten, so check that it + // is still valid. + MOZ_RELEASE_ASSERT(0 <= ix && ix < mEntrySize); + ProfileBufferEntry& entry = mEntries[ix]; + bool isStillValid = entry.isThreadId() && entry.mTagInt == aLS.mThreadId; + return isStillValid ? ix : -1; } - // This is rare. It typically happens after ProfileBuffer::reset() occurs. + // |aLS| denotes a sample which is older than either two wraparounds or one + // call to ProfileBuffer::reset. In either case it is no longer valid. + MOZ_ASSERT(aLS.mGeneration <= mGeneration - 2); return -1; } bool -ProfileBuffer::DuplicateLastSample(int aThreadId, const TimeStamp& aStartTime) +ProfileBuffer::DuplicateLastSample(const TimeStamp& aStartTime, LastSample& aLS) { - int lastSampleStartPos = FindLastSampleOfThread(aThreadId); + int lastSampleStartPos = FindLastSampleOfThread(aLS); if (lastSampleStartPos == -1) { return false; } - MOZ_ASSERT(mEntries[lastSampleStartPos].isThreadId()); + MOZ_ASSERT(mEntries[lastSampleStartPos].isThreadId() && + mEntries[lastSampleStartPos].mTagInt == aLS.mThreadId); - addTag(mEntries[lastSampleStartPos]); + addTagThreadId(aLS); // Go through the whole entry and duplicate it, until we find the next one. for (int readPos = (lastSampleStartPos + 1) % mEntrySize; @@ -794,7 +803,7 @@ ProfileBuffer::DuplicateLastSample(int aThreadId, const TimeStamp& aStartTime) // Don't copy markers break; default: - // Copy anything else we don't know about + // Copy anything else we don't know about. addTag(mEntries[readPos]); break; } diff --git a/tools/profiler/core/ThreadInfo.cpp b/tools/profiler/core/ThreadInfo.cpp index 29724462a9c53..58036bca49cc7 100644 --- a/tools/profiler/core/ThreadInfo.cpp +++ b/tools/profiler/core/ThreadInfo.cpp @@ -23,6 +23,7 @@ ThreadInfo::ThreadInfo(const char* aName, int aThreadId, bool aIsMainThread, , mStackTop(aStackTop) , mPendingDelete(false) , mHasProfile(false) + , mLastSample(aThreadId) { MOZ_COUNT_CTOR(ThreadInfo); mThread = NS_GetCurrentThread(); diff --git a/tools/profiler/core/ThreadInfo.h b/tools/profiler/core/ThreadInfo.h index a97715b23836e..4d3975fdab2ae 100644 --- a/tools/profiler/core/ThreadInfo.h +++ b/tools/profiler/core/ThreadInfo.h @@ -38,6 +38,8 @@ class ThreadInfo { size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const; + ProfileBuffer::LastSample& LastSample() { return mLastSample; } + private: mozilla::UniqueFreePtr mName; int mThreadId; @@ -104,6 +106,12 @@ class ThreadInfo { mozilla::Maybe mUniqueStacks; ThreadResponsiveness mRespInfo; + + // When sampling, this holds the generation number and offset in the + // ProfileBuffer of the most recent sample for this thread. + // mLastSample.mThreadId duplicates mThreadId in this structure, which + // simplifies some uses of mLastSample. + ProfileBuffer::LastSample mLastSample; }; #endif diff --git a/tools/profiler/core/platform-linux-android.cpp b/tools/profiler/core/platform-linux-android.cpp index 1acb396e701c2..a5d567046b86d 100644 --- a/tools/profiler/core/platform-linux-android.cpp +++ b/tools/profiler/core/platform-linux-android.cpp @@ -390,8 +390,8 @@ class SamplerThread } if (info->Stack()->CanDuplicateLastSampleDueToSleep() && - gPS->Buffer(lock)->DuplicateLastSample(info->ThreadId(), - gPS->StartTime(lock))) { + gPS->Buffer(lock)->DuplicateLastSample(gPS->StartTime(lock), + info->LastSample())) { continue; } diff --git a/tools/profiler/core/platform-macos.cpp b/tools/profiler/core/platform-macos.cpp index b514de2c3bdce..0f9f55a5414bf 100644 --- a/tools/profiler/core/platform-macos.cpp +++ b/tools/profiler/core/platform-macos.cpp @@ -146,8 +146,8 @@ class SamplerThread } if (info->Stack()->CanDuplicateLastSampleDueToSleep() && - gPS->Buffer(lock)->DuplicateLastSample(info->ThreadId(), - gPS->StartTime(lock))) { + gPS->Buffer(lock)->DuplicateLastSample(gPS->StartTime(lock), + info->LastSample())) { continue; } diff --git a/tools/profiler/core/platform-win32.cpp b/tools/profiler/core/platform-win32.cpp index eda8bf316fa95..40bdfb36b4a2b 100644 --- a/tools/profiler/core/platform-win32.cpp +++ b/tools/profiler/core/platform-win32.cpp @@ -174,8 +174,8 @@ class SamplerThread } if (info->Stack()->CanDuplicateLastSampleDueToSleep() && - gPS->Buffer(lock)->DuplicateLastSample(info->ThreadId(), - gPS->StartTime(lock))) { + gPS->Buffer(lock)->DuplicateLastSample(gPS->StartTime(lock), + info->LastSample())) { continue; } diff --git a/tools/profiler/core/platform.cpp b/tools/profiler/core/platform.cpp index 769cc6166a297..27fb61ba5a0d4 100644 --- a/tools/profiler/core/platform.cpp +++ b/tools/profiler/core/platform.cpp @@ -949,7 +949,8 @@ Tick(PS::LockRef aLock, ProfileBuffer* aBuffer, TickSample* aSample) { ThreadInfo& threadInfo = *aSample->threadInfo; - aBuffer->addTag(ProfileBufferEntry::ThreadId(threadInfo.ThreadId())); + MOZ_ASSERT(threadInfo.LastSample().mThreadId == threadInfo.ThreadId()); + aBuffer->addTagThreadId(threadInfo.LastSample()); mozilla::TimeDuration delta = aSample->timestamp - gPS->StartTime(aLock); aBuffer->addTag(ProfileBufferEntry::Time(delta.ToMilliseconds())); From 8ace9fea3742d28a02863dc30deb942ebdf5b997 Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Mon, 20 Mar 2017 12:36:47 +0100 Subject: [PATCH 230/300] Bug 1343007 - Do not insert redundant truncation nodes in constant folding. r=nbp --- js/src/jit/MIR.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/src/jit/MIR.cpp b/js/src/jit/MIR.cpp index 184fc33ced6ef..02ee711a89e63 100644 --- a/js/src/jit/MIR.cpp +++ b/js/src/jit/MIR.cpp @@ -3171,7 +3171,8 @@ MBinaryArithInstruction::foldsTo(TempAllocator& alloc) if (isTruncated()) { if (!folded->block()) block()->insertBefore(this, folded); - return MTruncateToInt32::New(alloc, folded); + if (folded->type() != MIRType::Int32) + return MTruncateToInt32::New(alloc, folded); } return folded; } From 419c3cc918e4bb2f714308e92dba20ad87150dbf Mon Sep 17 00:00:00 2001 From: Shawn Huang Date: Wed, 22 Mar 2017 18:12:11 +0800 Subject: [PATCH 231/300] Bug 1348877 - Load test case interfaces.html on https, r=annevk --- testing/web-platform/meta/MANIFEST.json | 8 ++++---- .../storage/{interfaces.html => interfaces.https.html} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename testing/web-platform/tests/storage/{interfaces.html => interfaces.https.html} (100%) diff --git a/testing/web-platform/meta/MANIFEST.json b/testing/web-platform/meta/MANIFEST.json index 9f8d07bdf355d..9aa9e0f41755b 100644 --- a/testing/web-platform/meta/MANIFEST.json +++ b/testing/web-platform/meta/MANIFEST.json @@ -120882,9 +120882,9 @@ {} ] ], - "storage/interfaces.html": [ + "storage/interfaces.https.html": [ [ - "/storage/interfaces.html", + "/storage/interfaces.https.html", {} ] ], @@ -181322,7 +181322,7 @@ "testharness" ], "html/webappapis/idle-callbacks/callback-removed-frame.html": [ - "79b4a278f0e35646cfdffeebf8f0523e2772bc9b", + "ff034276659407d2dea91d2b0ed0e5919b875904", "testharness" ], "html/webappapis/idle-callbacks/callback-suspended.html": [ @@ -203621,7 +203621,7 @@ "6e5db2d0c2f5d2d8f1e2d04da953a3f2c50bec7a", "testharness" ], - "storage/interfaces.html": [ + "storage/interfaces.https.html": [ "76fa61c3a87485266a7f9d6f66e5d08bb7881ff7", "testharness" ], diff --git a/testing/web-platform/tests/storage/interfaces.html b/testing/web-platform/tests/storage/interfaces.https.html similarity index 100% rename from testing/web-platform/tests/storage/interfaces.html rename to testing/web-platform/tests/storage/interfaces.https.html From 85a8ec6f2bf9afacab83ca39b4b38dffec9bdc74 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 22 Mar 2017 11:38:17 +0100 Subject: [PATCH 232/300] Bug 1343933 - Renaming Principal classes - part 1 - ExpandedPrincipal, r=qdot --- caps/BasePrincipal.h | 4 +- ...dedPrincipal.cpp => ExpandedPrincipal.cpp} | 58 +++++++++---------- ...xpandedPrincipal.h => ExpandedPrincipal.h} | 23 ++++---- caps/moz.build | 2 +- caps/nsIPrincipal.idl | 8 +-- dom/base/ScriptSettings.cpp | 2 +- dom/base/nsContentUtils.h | 4 +- ipc/glue/BackgroundUtils.cpp | 6 +- js/xpconnect/idl/xpccomponents.idl | 2 +- js/xpconnect/src/Sandbox.cpp | 6 +- js/xpconnect/src/XPCJSContext.cpp | 2 +- js/xpconnect/src/XPCWrappedNativeScope.cpp | 10 ++-- js/xpconnect/tests/chrome/test_bug996069.xul | 6 +- 13 files changed, 68 insertions(+), 65 deletions(-) rename caps/{nsExpandedPrincipal.cpp => ExpandedPrincipal.cpp} (70%) rename caps/{nsExpandedPrincipal.h => ExpandedPrincipal.h} (76%) diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 537b1a8e51e92..877060779f7a8 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -19,7 +19,7 @@ class nsIObjectOutputStream; class nsIObjectInputStream; class nsIURI; -class nsExpandedPrincipal; +class ExpandedPrincipal; namespace mozilla { @@ -283,7 +283,7 @@ class BasePrincipal : public nsJSPrincipals // principal would allow the load ignoring any common behavior implemented in // BasePrincipal::CheckMayLoad. virtual bool MayLoadInternal(nsIURI* aURI) = 0; - friend class ::nsExpandedPrincipal; + friend class ::ExpandedPrincipal; // This function should be called as the last step of the initialization of the // principal objects. It's typically called as the last step from the Init() diff --git a/caps/nsExpandedPrincipal.cpp b/caps/ExpandedPrincipal.cpp similarity index 70% rename from caps/nsExpandedPrincipal.cpp rename to caps/ExpandedPrincipal.cpp index 9a06abe874d78..c3e30c23b1bac 100644 --- a/caps/nsExpandedPrincipal.cpp +++ b/caps/ExpandedPrincipal.cpp @@ -4,19 +4,19 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "nsExpandedPrincipal.h" +#include "ExpandedPrincipal.h" #include "nsIClassInfoImpl.h" using namespace mozilla; -NS_IMPL_CLASSINFO(nsExpandedPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY, +NS_IMPL_CLASSINFO(ExpandedPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY, NS_EXPANDEDPRINCIPAL_CID) -NS_IMPL_QUERY_INTERFACE_CI(nsExpandedPrincipal, +NS_IMPL_QUERY_INTERFACE_CI(ExpandedPrincipal, nsIPrincipal, nsIExpandedPrincipal) -NS_IMPL_CI_INTERFACE_GETTER(nsExpandedPrincipal, - nsIPrincipal, - nsIExpandedPrincipal) +NS_IMPL_CI_INTERFACE_GETTER(ExpandedPrincipal, + nsIPrincipal, + nsIExpandedPrincipal) struct OriginComparator { @@ -43,11 +43,11 @@ struct OriginComparator } }; -nsExpandedPrincipal::nsExpandedPrincipal(nsTArray> &aWhiteList, - const OriginAttributes& aAttrs) +ExpandedPrincipal::ExpandedPrincipal(nsTArray> &aWhiteList, + const OriginAttributes& aAttrs) : BasePrincipal(eExpandedPrincipal) { - // We force the principals to be sorted by origin so that nsExpandedPrincipal + // We force the principals to be sorted by origin so that ExpandedPrincipal // origins can have a canonical form. OriginComparator c; for (size_t i = 0; i < aWhiteList.Length(); ++i) { @@ -56,33 +56,33 @@ nsExpandedPrincipal::nsExpandedPrincipal(nsTArray> &aWhit mOriginAttributes = aAttrs; } -nsExpandedPrincipal::~nsExpandedPrincipal() +ExpandedPrincipal::~ExpandedPrincipal() { } -already_AddRefed -nsExpandedPrincipal::Create(nsTArray>& aWhiteList, - const OriginAttributes& aAttrs) +already_AddRefed +ExpandedPrincipal::Create(nsTArray>& aWhiteList, + const OriginAttributes& aAttrs) { - RefPtr ep = new nsExpandedPrincipal(aWhiteList, aAttrs); + RefPtr ep = new ExpandedPrincipal(aWhiteList, aAttrs); ep->FinishInit(); return ep.forget(); } NS_IMETHODIMP -nsExpandedPrincipal::GetDomain(nsIURI** aDomain) +ExpandedPrincipal::GetDomain(nsIURI** aDomain) { *aDomain = nullptr; return NS_OK; } NS_IMETHODIMP -nsExpandedPrincipal::SetDomain(nsIURI* aDomain) +ExpandedPrincipal::SetDomain(nsIURI* aDomain) { return NS_OK; } nsresult -nsExpandedPrincipal::GetOriginInternal(nsACString& aOrigin) +ExpandedPrincipal::GetOriginInternal(nsACString& aOrigin) { aOrigin.AssignLiteral("[Expanded Principal ["); for (size_t i = 0; i < mPrincipals.Length(); ++i) { @@ -101,8 +101,8 @@ nsExpandedPrincipal::GetOriginInternal(nsACString& aOrigin) } bool -nsExpandedPrincipal::SubsumesInternal(nsIPrincipal* aOther, - BasePrincipal::DocumentDomainConsideration aConsideration) +ExpandedPrincipal::SubsumesInternal(nsIPrincipal* aOther, + BasePrincipal::DocumentDomainConsideration aConsideration) { // If aOther is an ExpandedPrincipal too, we break it down into its component // nsIPrincipals, and check subsumes on each one. @@ -133,7 +133,7 @@ nsExpandedPrincipal::SubsumesInternal(nsIPrincipal* aOther, } bool -nsExpandedPrincipal::MayLoadInternal(nsIURI* uri) +ExpandedPrincipal::MayLoadInternal(nsIURI* uri) { for (uint32_t i = 0; i < mPrincipals.Length(); ++i){ if (BasePrincipal::Cast(mPrincipals[i])->MayLoadInternal(uri)) { @@ -145,40 +145,40 @@ nsExpandedPrincipal::MayLoadInternal(nsIURI* uri) } NS_IMETHODIMP -nsExpandedPrincipal::GetHashValue(uint32_t* result) +ExpandedPrincipal::GetHashValue(uint32_t* result) { MOZ_CRASH("extended principal should never be used as key in a hash map"); } NS_IMETHODIMP -nsExpandedPrincipal::GetURI(nsIURI** aURI) +ExpandedPrincipal::GetURI(nsIURI** aURI) { *aURI = nullptr; return NS_OK; } NS_IMETHODIMP -nsExpandedPrincipal::GetWhiteList(nsTArray >** aWhiteList) +ExpandedPrincipal::GetWhiteList(nsTArray >** aWhiteList) { *aWhiteList = &mPrincipals; return NS_OK; } NS_IMETHODIMP -nsExpandedPrincipal::GetBaseDomain(nsACString& aBaseDomain) +ExpandedPrincipal::GetBaseDomain(nsACString& aBaseDomain) { return NS_ERROR_NOT_AVAILABLE; } NS_IMETHODIMP -nsExpandedPrincipal::GetAddonId(nsAString& aAddonId) +ExpandedPrincipal::GetAddonId(nsAString& aAddonId) { aAddonId.Truncate(); return NS_OK; }; bool -nsExpandedPrincipal::AddonHasPermission(const nsAString& aPerm) +ExpandedPrincipal::AddonHasPermission(const nsAString& aPerm) { for (size_t i = 0; i < mPrincipals.Length(); ++i) { if (BasePrincipal::Cast(mPrincipals[i])->AddonHasPermission(aPerm)) { @@ -189,7 +189,7 @@ nsExpandedPrincipal::AddonHasPermission(const nsAString& aPerm) } nsresult -nsExpandedPrincipal::GetScriptLocation(nsACString& aStr) +ExpandedPrincipal::GetScriptLocation(nsACString& aStr) { aStr.Assign("[Expanded Principal ["); for (size_t i = 0; i < mPrincipals.Length(); ++i) { @@ -213,13 +213,13 @@ nsExpandedPrincipal::GetScriptLocation(nsACString& aStr) ////////////////////////////////////////// NS_IMETHODIMP -nsExpandedPrincipal::Read(nsIObjectInputStream* aStream) +ExpandedPrincipal::Read(nsIObjectInputStream* aStream) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsExpandedPrincipal::Write(nsIObjectOutputStream* aStream) +ExpandedPrincipal::Write(nsIObjectOutputStream* aStream) { return NS_ERROR_NOT_IMPLEMENTED; } diff --git a/caps/nsExpandedPrincipal.h b/caps/ExpandedPrincipal.h similarity index 76% rename from caps/nsExpandedPrincipal.h rename to caps/ExpandedPrincipal.h index 360f83ce65d0e..06750a09353ef 100644 --- a/caps/nsExpandedPrincipal.h +++ b/caps/ExpandedPrincipal.h @@ -3,8 +3,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef nsExpandedPrincipal_h -#define nsExpandedPrincipal_h +#ifndef ExpandedPrincipal_h +#define ExpandedPrincipal_h #include "nsCOMPtr.h" #include "nsJSPrincipals.h" @@ -12,19 +12,20 @@ #include "nsNetUtil.h" #include "mozilla/BasePrincipal.h" -class nsExpandedPrincipal : public nsIExpandedPrincipal - , public mozilla::BasePrincipal +class ExpandedPrincipal : public nsIExpandedPrincipal + , public mozilla::BasePrincipal { - nsExpandedPrincipal(nsTArray> &aWhiteList, - const mozilla::OriginAttributes& aAttrs); + ExpandedPrincipal(nsTArray> &aWhiteList, + const mozilla::OriginAttributes& aAttrs); public: - static already_AddRefed + static already_AddRefed Create(nsTArray>& aWhiteList, const mozilla::OriginAttributes& aAttrs); NS_DECL_NSIEXPANDEDPRINCIPAL NS_DECL_NSISERIALIZABLE + NS_IMETHOD_(MozExternalRefCountType) AddRef() override { return nsJSPrincipals::AddRef(); }; NS_IMETHOD_(MozExternalRefCountType) Release() override { return nsJSPrincipals::Release(); }; NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; @@ -39,9 +40,11 @@ class nsExpandedPrincipal : public nsIExpandedPrincipal nsresult GetOriginInternal(nsACString& aOrigin) override; protected: - virtual ~nsExpandedPrincipal(); + virtual ~ExpandedPrincipal(); + + bool SubsumesInternal(nsIPrincipal* aOther, + DocumentDomainConsideration aConsideration) override; - bool SubsumesInternal(nsIPrincipal* aOther, DocumentDomainConsideration aConsideration) override; bool MayLoadInternal(nsIURI* aURI) override; private: @@ -53,4 +56,4 @@ class nsExpandedPrincipal : public nsIExpandedPrincipal { 0xe8ee88b0, 0x5571, 0x4086, \ { 0xa4, 0x5b, 0x39, 0xa7, 0x16, 0x90, 0x6b, 0xdb } } -#endif // nsExpandedPrincipal_h +#endif // ExpandedPrincipal_h diff --git a/caps/moz.build b/caps/moz.build index 4a2189bf958e8..3d5e52af97104 100644 --- a/caps/moz.build +++ b/caps/moz.build @@ -41,7 +41,7 @@ SOURCES += [ UNIFIED_SOURCES += [ 'DomainPolicy.cpp', - 'nsExpandedPrincipal.cpp', + 'ExpandedPrincipal.cpp', 'nsJSPrincipals.cpp', 'nsNullPrincipal.cpp', 'nsNullPrincipalURI.cpp', diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index 870792527813b..a34853e376044 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -358,11 +358,11 @@ interface nsIPrincipal : nsISerializable /** * If nsSystemPrincipal is too risky to use, but we want a principal to access - * more than one origin, nsExpandedPrincipals letting us define an array of - * principals it subsumes. So script with an nsExpandedPrincipals will gain + * more than one origin, ExpandedPrincipals letting us define an array of + * principals it subsumes. So script with an ExpandedPrincipals will gain * same origin access when at least one of its principals it contains gained - * sameorigin acccess. An nsExpandedPrincipal will be subsumed by the system - * principal, and by another nsExpandedPrincipal that has all its principals. + * sameorigin acccess. An ExpandedPrincipal will be subsumed by the system + * principal, and by another ExpandedPrincipal that has all its principals. * It is added for jetpack content-scripts to let them interact with the * content and a well defined set of other domains, without the risk of * leaking out a system principal to the content. See: Bug 734891 diff --git a/dom/base/ScriptSettings.cpp b/dom/base/ScriptSettings.cpp index 7d0e4566b294c..a89b3419127a2 100644 --- a/dom/base/ScriptSettings.cpp +++ b/dom/base/ScriptSettings.cpp @@ -164,7 +164,7 @@ ScriptSettingsStackEntry::~ScriptSettingsStackEntry() // If the entry or incumbent global ends up being something that the subject // principal doesn't subsume, we don't want to use it. This never happens on // the web, but can happen with asymmetric privilege relationships (i.e. -// nsExpandedPrincipal and System Principal). +// ExpandedPrincipal and System Principal). // // The most correct thing to use instead would be the topmost global on the // callstack whose principal is subsumed by the subject principal. But that's diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 159343549fe69..3aab08822895c 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -1578,12 +1578,12 @@ class nsContentUtils static bool IsSystemPrincipal(nsIPrincipal* aPrincipal); /** - * Returns true if aPrincipal is an nsExpandedPrincipal. + * Returns true if aPrincipal is an ExpandedPrincipal. */ static bool IsExpandedPrincipal(nsIPrincipal* aPrincipal); /** - * Returns true if aPrincipal is the system or an nsExpandedPrincipal. + * Returns true if aPrincipal is the system or an ExpandedPrincipal. */ static bool IsSystemOrExpandedPrincipal(nsIPrincipal* aPrincipal) { diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 8d6014e4749fa..a2936e1cfcc39 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -11,7 +11,7 @@ #include "mozilla/BasePrincipal.h" #include "mozilla/ipc/PBackgroundSharedTypes.h" #include "mozilla/net/NeckoChannelParams.h" -#include "nsExpandedPrincipal.h" +#include "ExpandedPrincipal.h" #include "nsPrincipal.h" #include "nsIScriptSecurityManager.h" #include "nsIURI.h" @@ -124,8 +124,8 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo, whitelist.AppendElement(wlPrincipal); } - RefPtr expandedPrincipal = - nsExpandedPrincipal::Create(whitelist, info.attrs()); + RefPtr expandedPrincipal = + ExpandedPrincipal::Create(whitelist, info.attrs()); if (!expandedPrincipal) { NS_WARNING("could not instantiate expanded principal"); return nullptr; diff --git a/js/xpconnect/idl/xpccomponents.idl b/js/xpconnect/idl/xpccomponents.idl index 711ea4c64238e..10c0537c801c0 100644 --- a/js/xpconnect/idl/xpccomponents.idl +++ b/js/xpconnect/idl/xpccomponents.idl @@ -693,7 +693,7 @@ interface nsIXPCComponents_Utils : nsISupports * Interface for the 'Components' object. * * The first interface contains things that are available to non-chrome XBL code -* that runs in a scope with an nsExpandedPrincipal. The second interface +* that runs in a scope with an ExpandedPrincipal. The second interface * includes members that are only exposed to chrome. */ diff --git a/js/xpconnect/src/Sandbox.cpp b/js/xpconnect/src/Sandbox.cpp index d52c408660bcd..2a90b7ada490b 100644 --- a/js/xpconnect/src/Sandbox.cpp +++ b/js/xpconnect/src/Sandbox.cpp @@ -20,7 +20,7 @@ #include "nsJSUtils.h" #include "nsNetUtil.h" #include "nsNullPrincipal.h" -#include "nsExpandedPrincipal.h" +#include "ExpandedPrincipal.h" #include "WrapperFactory.h" #include "xpcprivate.h" #include "xpc_make_class.h" @@ -1439,8 +1439,8 @@ GetExpandedPrincipal(JSContext* cx, HandleObject arrayObj, } } - RefPtr result = - nsExpandedPrincipal::Create(allowedDomains, attrs.ref()); + RefPtr result = + ExpandedPrincipal::Create(allowedDomains, attrs.ref()); result.forget(out); return true; } diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp index ed33f230a7355..6f72c9db85100 100644 --- a/js/xpconnect/src/XPCJSContext.cpp +++ b/js/xpconnect/src/XPCJSContext.cpp @@ -342,7 +342,7 @@ PrincipalImmuneToScriptPolicy(nsIPrincipal* aPrincipal) if (nsXPConnect::SecurityManager()->IsSystemPrincipal(aPrincipal)) return true; - // nsExpandedPrincipal gets a free pass. + // ExpandedPrincipal gets a free pass. nsCOMPtr ep = do_QueryInterface(aPrincipal); if (ep) return true; diff --git a/js/xpconnect/src/XPCWrappedNativeScope.cpp b/js/xpconnect/src/XPCWrappedNativeScope.cpp index c3c87d76a795e..be86e08781586 100644 --- a/js/xpconnect/src/XPCWrappedNativeScope.cpp +++ b/js/xpconnect/src/XPCWrappedNativeScope.cpp @@ -10,7 +10,7 @@ #include "XPCWrapper.h" #include "nsContentUtils.h" #include "nsCycleCollectionNoteRootCallback.h" -#include "nsExpandedPrincipal.h" +#include "ExpandedPrincipal.h" #include "mozilla/MemoryReporting.h" #include "mozilla/Preferences.h" #include "nsIAddonInterposition.h" @@ -290,14 +290,14 @@ XPCWrappedNativeScope::EnsureContentXBLScope(JSContext* cx) options.proto = global; options.sameZoneAs = global; - // Use an nsExpandedPrincipal to create asymmetric security. + // Use an ExpandedPrincipal to create asymmetric security. nsIPrincipal* principal = GetPrincipal(); MOZ_ASSERT(!nsContentUtils::IsExpandedPrincipal(principal)); nsTArray> principalAsArray(1); principalAsArray.AppendElement(principal); - RefPtr ep = - nsExpandedPrincipal::Create(principalAsArray, - principal->OriginAttributesRef()); + RefPtr ep = + ExpandedPrincipal::Create(principalAsArray, + principal->OriginAttributesRef()); // Create the sandbox. RootedValue v(cx); diff --git a/js/xpconnect/tests/chrome/test_bug996069.xul b/js/xpconnect/tests/chrome/test_bug996069.xul index f61003bb1baa4..52e33c2ec10f1 100644 --- a/js/xpconnect/tests/chrome/test_bug996069.xul +++ b/js/xpconnect/tests/chrome/test_bug996069.xul @@ -28,15 +28,15 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=996069 ifr.wrappedJSObject.finishTest = function() { // If we got here we did not hit the NS_ReleaseAssert... - ok(true, "nsExpandedPrincipal should not be inherited by content windows"); + ok(true, "ExpandedPrincipal should not be inherited by content windows"); // But let's be sure that the new window does not have nsEP newWin.wrappedJSObject.obj = Cu.evalInSandbox("var obj = { foo: 'bar' }; obj", sb); try { newWin.eval("obj.foo"); - ok(false, "newWin should not have access to object from a scope with nsExpandedPrincipal"); + ok(false, "newWin should not have access to object from a scope with ExpandedPrincipal"); } catch (e) { - ok(/Permission denied/.exec(e.message), "newWin should not have access to object from a scope with nsExpandedPrincipal"); + ok(/Permission denied/.exec(e.message), "newWin should not have access to object from a scope with ExpandedPrincipal"); } newWin.close(); SimpleTest.finish(); From 4fd2edf372af00719b9980ad0c856b2f96f620b4 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 22 Mar 2017 11:38:40 +0100 Subject: [PATCH 233/300] Bug 1343933 - Renaming Principal classes - part 2 - NullPrincipal, r=qdot --- caps/BasePrincipal.cpp | 8 +- ...{nsNullPrincipal.cpp => NullPrincipal.cpp} | 59 ++++---- caps/{nsNullPrincipal.h => NullPrincipal.h} | 19 +-- ...lPrincipalURI.cpp => NullPrincipalURI.cpp} | 130 +++++++++--------- ...sNullPrincipalURI.h => NullPrincipalURI.h} | 22 +-- caps/moz.build | 10 +- caps/nsScriptSecurityManager.cpp | 4 +- docshell/base/nsDocShell.cpp | 18 +-- dom/base/DOMParser.cpp | 6 +- dom/base/Location.cpp | 4 +- dom/base/nsContentUtils.cpp | 6 +- dom/base/nsDocument.cpp | 4 +- dom/base/nsFrameLoader.cpp | 4 +- dom/base/nsNodeInfoManager.cpp | 4 +- dom/base/nsTreeSanitizer.cpp | 4 +- dom/bindings/SimpleGlobalObject.cpp | 4 +- dom/json/nsJSON.cpp | 4 +- dom/media/MediaManager.cpp | 4 +- dom/media/MediaStreamTrack.h | 2 +- dom/plugins/base/nsPluginHost.cpp | 2 +- .../base/nsPluginStreamListenerPeer.cpp | 2 +- extensions/gio/nsGIOProtocolHandler.cpp | 2 +- gfx/thebes/gfxSVGGlyphs.cpp | 4 +- image/decoders/icon/android/nsIconChannel.cpp | 4 +- image/decoders/icon/gtk/nsIconChannel.cpp | 4 +- ipc/glue/BackgroundUtils.cpp | 4 +- ipc/glue/URIUtils.cpp | 4 +- js/xpconnect/src/Sandbox.cpp | 6 +- layout/build/nsLayoutModule.cpp | 6 +- layout/style/CSSStyleSheet.cpp | 2 +- layout/style/StyleSheet.cpp | 6 +- .../src/peerconnection/PeerConnectionImpl.cpp | 4 +- netwerk/base/LoadInfo.cpp | 8 +- .../protocol/ftp/nsFtpConnectionThread.cpp | 2 +- netwerk/protocol/http/nsCORSListenerProxy.cpp | 4 +- netwerk/protocol/http/nsHttpChannel.cpp | 2 +- .../viewsource/nsViewSourceChannel.cpp | 4 +- parser/html/nsParserUtils.cpp | 4 +- parser/htmlparser/nsExpatDriver.cpp | 4 +- parser/xml/nsSAXXMLReader.cpp | 4 +- rdf/base/nsRDFXMLParser.cpp | 4 +- .../components/places/nsFaviconService.cpp | 6 +- 42 files changed, 205 insertions(+), 203 deletions(-) rename caps/{nsNullPrincipal.cpp => NullPrincipal.cpp} (73%) rename caps/{nsNullPrincipal.h => NullPrincipal.h} (84%) rename caps/{nsNullPrincipalURI.cpp => NullPrincipalURI.cpp} (61%) rename caps/{nsNullPrincipalURI.h => NullPrincipalURI.h} (73%) diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index 466e4994cd0b2..8ac83ef0c5850 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -19,7 +19,7 @@ #include "nsPrincipal.h" #include "nsNetUtil.h" #include "nsIURIWithPrincipal.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsScriptSecurityManager.h" #include "nsServiceManagerUtils.h" @@ -645,7 +645,7 @@ BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI, const OriginAttributes& aAt nsresult rv = NS_URIChainHasFlags(aURI, nsIProtocolHandler::URI_INHERITS_SECURITY_CONTEXT, &inheritsPrincipal); if (NS_FAILED(rv) || inheritsPrincipal) { - return nsNullPrincipal::Create(aAttrs); + return NullPrincipal::Create(aAttrs); } // Check whether the URI knows what its principal is supposed to be. @@ -654,7 +654,7 @@ BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI, const OriginAttributes& aAt nsCOMPtr principal; uriPrinc->GetPrincipal(getter_AddRefs(principal)); if (!principal) { - return nsNullPrincipal::Create(aAttrs); + return NullPrincipal::Create(aAttrs); } RefPtr concrete = Cast(principal); return concrete.forget(); @@ -674,7 +674,7 @@ BasePrincipal::CreateCodebasePrincipal(const nsACString& aOrigin) "CreateCodebasePrincipal does not support System and Expanded principals"); MOZ_ASSERT(!StringBeginsWith(aOrigin, NS_LITERAL_CSTRING(NS_NULLPRINCIPAL_SCHEME ":")), - "CreateCodebasePrincipal does not support nsNullPrincipal"); + "CreateCodebasePrincipal does not support NullPrincipal"); nsAutoCString originNoSuffix; mozilla::OriginAttributes attrs; diff --git a/caps/nsNullPrincipal.cpp b/caps/NullPrincipal.cpp similarity index 73% rename from caps/nsNullPrincipal.cpp rename to caps/NullPrincipal.cpp index fe846ac25b0c1..b3e4c745e63ad 100644 --- a/caps/nsNullPrincipal.cpp +++ b/caps/NullPrincipal.cpp @@ -13,8 +13,8 @@ #include "mozilla/ArrayUtils.h" #include "nsDocShell.h" -#include "nsNullPrincipal.h" -#include "nsNullPrincipalURI.h" +#include "NullPrincipal.h" +#include "NullPrincipalURI.h" #include "nsMemory.h" #include "nsIURIWithPrincipal.h" #include "nsIClassInfoImpl.h" @@ -27,40 +27,40 @@ using namespace mozilla; -NS_IMPL_CLASSINFO(nsNullPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY, +NS_IMPL_CLASSINFO(NullPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY, NS_NULLPRINCIPAL_CID) -NS_IMPL_QUERY_INTERFACE_CI(nsNullPrincipal, +NS_IMPL_QUERY_INTERFACE_CI(NullPrincipal, nsIPrincipal, nsISerializable) -NS_IMPL_CI_INTERFACE_GETTER(nsNullPrincipal, +NS_IMPL_CI_INTERFACE_GETTER(NullPrincipal, nsIPrincipal, nsISerializable) -/* static */ already_AddRefed -nsNullPrincipal::CreateWithInheritedAttributes(nsIPrincipal* aInheritFrom) +/* static */ already_AddRefed +NullPrincipal::CreateWithInheritedAttributes(nsIPrincipal* aInheritFrom) { - RefPtr nullPrin = new nsNullPrincipal(); + RefPtr nullPrin = new NullPrincipal(); nsresult rv = nullPrin->Init(Cast(aInheritFrom)->OriginAttributesRef()); MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); return nullPrin.forget(); } -/* static */ already_AddRefed -nsNullPrincipal::CreateWithInheritedAttributes(nsIDocShell* aDocShell, bool aIsFirstParty) +/* static */ already_AddRefed +NullPrincipal::CreateWithInheritedAttributes(nsIDocShell* aDocShell, bool aIsFirstParty) { OriginAttributes attrs = nsDocShell::Cast(aDocShell)->GetOriginAttributes(); attrs.SetFirstPartyDomain(aIsFirstParty, NS_LITERAL_CSTRING(NULL_PRINCIPAL_FIRST_PARTY_DOMAIN)); - RefPtr nullPrin = new nsNullPrincipal(); + RefPtr nullPrin = new NullPrincipal(); nsresult rv = nullPrin->Init(attrs); MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); return nullPrin.forget(); } -/* static */ already_AddRefed -nsNullPrincipal::Create(const OriginAttributes& aOriginAttributes, nsIURI* aURI) +/* static */ already_AddRefed +NullPrincipal::Create(const OriginAttributes& aOriginAttributes, nsIURI* aURI) { - RefPtr nullPrin = new nsNullPrincipal(); + RefPtr nullPrin = new NullPrincipal(); nsresult rv = nullPrin->Init(aOriginAttributes, aURI); MOZ_RELEASE_ASSERT(NS_SUCCEEDED(rv)); @@ -68,7 +68,7 @@ nsNullPrincipal::Create(const OriginAttributes& aOriginAttributes, nsIURI* aURI) } nsresult -nsNullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI) +NullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI) { mOriginAttributes = aOriginAttributes; @@ -82,7 +82,7 @@ nsNullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI) mURI = aURI; } else { - mURI = nsNullPrincipalURI::Create(); + mURI = NullPrincipalURI::Create(); NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE); } @@ -92,7 +92,7 @@ nsNullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI) } nsresult -nsNullPrincipal::GetScriptLocation(nsACString &aStr) +NullPrincipal::GetScriptLocation(nsACString &aStr) { return mURI->GetSpec(aStr); } @@ -102,14 +102,15 @@ nsNullPrincipal::GetScriptLocation(nsACString &aStr) */ NS_IMETHODIMP -nsNullPrincipal::GetHashValue(uint32_t *aResult) +NullPrincipal::GetHashValue(uint32_t *aResult) { *aResult = (NS_PTR_TO_INT32(this) >> 2); return NS_OK; } NS_IMETHODIMP -nsNullPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) { +NullPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) +{ // Never destroy an existing CSP on the principal. // This method should only be called in rare cases. @@ -123,19 +124,19 @@ nsNullPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) { } NS_IMETHODIMP -nsNullPrincipal::GetURI(nsIURI** aURI) +NullPrincipal::GetURI(nsIURI** aURI) { return NS_EnsureSafeToReturn(mURI, aURI); } NS_IMETHODIMP -nsNullPrincipal::GetDomain(nsIURI** aDomain) +NullPrincipal::GetDomain(nsIURI** aDomain) { return NS_EnsureSafeToReturn(mURI, aDomain); } NS_IMETHODIMP -nsNullPrincipal::SetDomain(nsIURI* aDomain) +NullPrincipal::SetDomain(nsIURI* aDomain) { // I think the right thing to do here is to just throw... Silently failing // seems counterproductive. @@ -143,13 +144,13 @@ nsNullPrincipal::SetDomain(nsIURI* aDomain) } nsresult -nsNullPrincipal::GetOriginInternal(nsACString& aOrigin) +NullPrincipal::GetOriginInternal(nsACString& aOrigin) { return mURI->GetSpec(aOrigin); } bool -nsNullPrincipal::MayLoadInternal(nsIURI* aURI) +NullPrincipal::MayLoadInternal(nsIURI* aURI) { // Also allow the load if we are the principal of the URI being checked. nsCOMPtr uriPrinc = do_QueryInterface(aURI); @@ -166,14 +167,14 @@ nsNullPrincipal::MayLoadInternal(nsIURI* aURI) } NS_IMETHODIMP -nsNullPrincipal::GetBaseDomain(nsACString& aBaseDomain) +NullPrincipal::GetBaseDomain(nsACString& aBaseDomain) { // For a null principal, we use our unique uuid as the base domain. return mURI->GetPath(aBaseDomain); } NS_IMETHODIMP -nsNullPrincipal::GetAddonId(nsAString& aAddonId) +NullPrincipal::GetAddonId(nsAString& aAddonId) { aAddonId.Truncate(); return NS_OK; @@ -183,9 +184,9 @@ nsNullPrincipal::GetAddonId(nsAString& aAddonId) * nsISerializable implementation */ NS_IMETHODIMP -nsNullPrincipal::Read(nsIObjectInputStream* aStream) +NullPrincipal::Read(nsIObjectInputStream* aStream) { - // Note - nsNullPrincipal use NS_GENERIC_FACTORY_CONSTRUCTOR_INIT, which means + // Note - NullPrincipal use NS_GENERIC_FACTORY_CONSTRUCTOR_INIT, which means // that the Init() method has already been invoked by the time we deserialize. // This is in contrast to nsPrincipal, which uses NS_GENERIC_FACTORY_CONSTRUCTOR, // in which case ::Read needs to invoke Init(). @@ -210,7 +211,7 @@ nsNullPrincipal::Read(nsIObjectInputStream* aStream) } NS_IMETHODIMP -nsNullPrincipal::Write(nsIObjectOutputStream* aStream) +NullPrincipal::Write(nsIObjectOutputStream* aStream) { NS_ENSURE_STATE(mURI); diff --git a/caps/nsNullPrincipal.h b/caps/NullPrincipal.h similarity index 84% rename from caps/nsNullPrincipal.h rename to caps/NullPrincipal.h index 653029258f4bf..b036d0c3b220e 100644 --- a/caps/nsNullPrincipal.h +++ b/caps/NullPrincipal.h @@ -9,8 +9,8 @@ * same-origin with anything but themselves. */ -#ifndef nsNullPrincipal_h__ -#define nsNullPrincipal_h__ +#ifndef NullPrincipal_h +#define NullPrincipal_h #include "nsIPrincipal.h" #include "nsJSPrincipals.h" @@ -30,13 +30,13 @@ class nsIURI; #define NS_NULLPRINCIPAL_SCHEME "moz-nullprincipal" -class nsNullPrincipal final : public mozilla::BasePrincipal +class NullPrincipal final : public mozilla::BasePrincipal { public: // This should only be used by deserialization, and the factory constructor. // Other consumers should use the Create and CreateWithInheritedAttributes // methods. - nsNullPrincipal() + NullPrincipal() : BasePrincipal(eNullPrincipal) { } @@ -53,15 +53,16 @@ class nsNullPrincipal final : public mozilla::BasePrincipal NS_IMETHOD GetAddonId(nsAString& aAddonId) override; nsresult GetOriginInternal(nsACString& aOrigin) override; - static already_AddRefed CreateWithInheritedAttributes(nsIPrincipal* aInheritFrom); + static already_AddRefed CreateWithInheritedAttributes(nsIPrincipal* aInheritFrom); // Create NullPrincipal with origin attributes from docshell. // If aIsFirstParty is true, and the pref 'privacy.firstparty.isolate' is also // enabled, the mFirstPartyDomain value of the origin attributes will be set // to NULL_PRINCIPAL_FIRST_PARTY_DOMAIN. - static already_AddRefed CreateWithInheritedAttributes(nsIDocShell* aDocShell, bool aIsFirstParty = false); + static already_AddRefed + CreateWithInheritedAttributes(nsIDocShell* aDocShell, bool aIsFirstParty = false); - static already_AddRefed + static already_AddRefed Create(const mozilla::OriginAttributes& aOriginAttributes = mozilla::OriginAttributes(), nsIURI* aURI = nullptr); @@ -71,7 +72,7 @@ class nsNullPrincipal final : public mozilla::BasePrincipal virtual nsresult GetScriptLocation(nsACString &aStr) override; protected: - virtual ~nsNullPrincipal() {} + virtual ~NullPrincipal() = default; bool SubsumesInternal(nsIPrincipal* aOther, DocumentDomainConsideration aConsideration) override { @@ -83,4 +84,4 @@ class nsNullPrincipal final : public mozilla::BasePrincipal nsCOMPtr mURI; }; -#endif // nsNullPrincipal_h__ +#endif // NullPrincipal_h__ diff --git a/caps/nsNullPrincipalURI.cpp b/caps/NullPrincipalURI.cpp similarity index 61% rename from caps/nsNullPrincipalURI.cpp rename to caps/NullPrincipalURI.cpp index f8b86716066ba..17d98a488faf9 100644 --- a/caps/nsNullPrincipalURI.cpp +++ b/caps/NullPrincipalURI.cpp @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "nsNullPrincipalURI.h" +#include "NullPrincipalURI.h" #include "mozilla/DebugOnly.h" #include "mozilla/MemoryReporting.h" @@ -16,21 +16,21 @@ #include "nsIUUIDGenerator.h" //////////////////////////////////////////////////////////////////////////////// -//// nsNullPrincipalURI +//// NullPrincipalURI -nsNullPrincipalURI::nsNullPrincipalURI() +NullPrincipalURI::NullPrincipalURI() : mPath(mPathBytes, ArrayLength(mPathBytes), ArrayLength(mPathBytes) - 1) { } -nsNullPrincipalURI::nsNullPrincipalURI(const nsNullPrincipalURI& aOther) +NullPrincipalURI::NullPrincipalURI(const NullPrincipalURI& aOther) : mPath(mPathBytes, ArrayLength(mPathBytes), ArrayLength(mPathBytes) - 1) { mPath.Assign(aOther.mPath); } nsresult -nsNullPrincipalURI::Init() +NullPrincipalURI::Init() { // FIXME: bug 327161 -- make sure the uuid generator is reseeding-resistant. nsCOMPtr uuidgen = services::GetUUIDGenerator(); @@ -51,10 +51,10 @@ nsNullPrincipalURI::Init() } /* static */ -already_AddRefed -nsNullPrincipalURI::Create() +already_AddRefed +NullPrincipalURI::Create() { - RefPtr uri = new nsNullPrincipalURI(); + RefPtr uri = new NullPrincipalURI(); nsresult rv = uri->Init(); NS_ENSURE_SUCCESS(rv, nullptr); return uri.forget(); @@ -63,13 +63,13 @@ nsNullPrincipalURI::Create() static NS_DEFINE_CID(kNullPrincipalURIImplementationCID, NS_NULLPRINCIPALURI_IMPLEMENTATION_CID); -NS_IMPL_ADDREF(nsNullPrincipalURI) -NS_IMPL_RELEASE(nsNullPrincipalURI) +NS_IMPL_ADDREF(NullPrincipalURI) +NS_IMPL_RELEASE(NullPrincipalURI) -NS_INTERFACE_MAP_BEGIN(nsNullPrincipalURI) +NS_INTERFACE_MAP_BEGIN(NullPrincipalURI) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURI) if (aIID.Equals(kNullPrincipalURIImplementationCID)) - foundInterface = static_cast(this); + foundInterface = static_cast(this); else NS_INTERFACE_MAP_ENTRY(nsIURI) NS_INTERFACE_MAP_ENTRY(nsISizeOf) @@ -80,23 +80,23 @@ NS_INTERFACE_MAP_END //// nsIURI NS_IMETHODIMP -nsNullPrincipalURI::GetAsciiHost(nsACString &_host) +NullPrincipalURI::GetAsciiHost(nsACString& _host) { _host.Truncate(); return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::GetAsciiHostPort(nsACString &_hostport) +NullPrincipalURI::GetAsciiHostPort(nsACString& _hostport) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetAsciiSpec(nsACString &_spec) +NullPrincipalURI::GetAsciiSpec(nsACString& _spec) { nsAutoCString buffer; - // Ignore the return value -- nsNullPrincipalURI::GetSpec() is infallible. + // Ignore the return value -- NullPrincipalURI::GetSpec() is infallible. Unused << GetSpec(buffer); // This uses the infallible version of |NS_EscapeURL| as |GetSpec| is // already infallible. @@ -105,141 +105,141 @@ nsNullPrincipalURI::GetAsciiSpec(nsACString &_spec) } NS_IMETHODIMP -nsNullPrincipalURI::GetHost(nsACString &_host) +NullPrincipalURI::GetHost(nsACString& _host) { _host.Truncate(); return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::SetHost(const nsACString &aHost) +NullPrincipalURI::SetHost(const nsACString& aHost) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetHostPort(nsACString &_host) +NullPrincipalURI::GetHostPort(nsACString& _host) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetHostPort(const nsACString &aHost) +NullPrincipalURI::SetHostPort(const nsACString& aHost) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetHostAndPort(const nsACString &aHost) +NullPrincipalURI::SetHostAndPort(const nsACString& aHost) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetOriginCharset(nsACString &_charset) +NullPrincipalURI::GetOriginCharset(nsACString& _charset) { _charset.Truncate(); return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::GetPassword(nsACString &_password) +NullPrincipalURI::GetPassword(nsACString& _password) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetPassword(const nsACString &aPassword) +NullPrincipalURI::SetPassword(const nsACString& aPassword) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetPath(nsACString &_path) +NullPrincipalURI::GetPath(nsACString& _path) { _path = mPath; return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::SetPath(const nsACString &aPath) +NullPrincipalURI::SetPath(const nsACString& aPath) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetFilePath(nsACString &aFilePath) +NullPrincipalURI::GetFilePath(nsACString& aFilePath) { aFilePath.Truncate(); return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetFilePath(const nsACString &aFilePath) +NullPrincipalURI::SetFilePath(const nsACString& aFilePath) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetQuery(nsACString &aQuery) +NullPrincipalURI::GetQuery(nsACString& aQuery) { aQuery.Truncate(); return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetQuery(const nsACString &aQuery) +NullPrincipalURI::SetQuery(const nsACString& aQuery) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetRef(nsACString &_ref) +NullPrincipalURI::GetRef(nsACString& _ref) { _ref.Truncate(); return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetRef(const nsACString &aRef) +NullPrincipalURI::SetRef(const nsACString& aRef) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetPrePath(nsACString &_prePath) +NullPrincipalURI::GetPrePath(nsACString& _prePath) { _prePath = NS_LITERAL_CSTRING(NS_NULLPRINCIPAL_SCHEME ":"); return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::GetPort(int32_t *_port) +NullPrincipalURI::GetPort(int32_t* _port) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetPort(int32_t aPort) +NullPrincipalURI::SetPort(int32_t aPort) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetScheme(nsACString &_scheme) +NullPrincipalURI::GetScheme(nsACString& _scheme) { _scheme = NS_LITERAL_CSTRING(NS_NULLPRINCIPAL_SCHEME); return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::SetScheme(const nsACString &aScheme) +NullPrincipalURI::SetScheme(const nsACString& aScheme) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetSpec(nsACString &_spec) +NullPrincipalURI::GetSpec(nsACString& _spec) { _spec = NS_LITERAL_CSTRING(NS_NULLPRINCIPAL_SCHEME ":") + mPath; return NS_OK; @@ -247,77 +247,77 @@ nsNullPrincipalURI::GetSpec(nsACString &_spec) // result may contain unescaped UTF-8 characters NS_IMETHODIMP -nsNullPrincipalURI::GetSpecIgnoringRef(nsACString &result) +NullPrincipalURI::GetSpecIgnoringRef(nsACString& _result) { - return GetSpec(result); + return GetSpec(_result); } NS_IMETHODIMP -nsNullPrincipalURI::GetHasRef(bool *result) +NullPrincipalURI::GetHasRef(bool* _result) { - *result = false; + *_result = false; return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::SetSpec(const nsACString &aSpec) +NullPrincipalURI::SetSpec(const nsACString& aSpec) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetUsername(nsACString &_username) +NullPrincipalURI::GetUsername(nsACString& _username) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetUsername(const nsACString &aUsername) +NullPrincipalURI::SetUsername(const nsACString& aUsername) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::GetUserPass(nsACString &_userPass) +NullPrincipalURI::GetUserPass(nsACString& _userPass) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::SetUserPass(const nsACString &aUserPass) +NullPrincipalURI::SetUserPass(const nsACString& aUserPass) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP -nsNullPrincipalURI::Clone(nsIURI **_newURI) +NullPrincipalURI::Clone(nsIURI** _newURI) { - nsCOMPtr uri = new nsNullPrincipalURI(*this); + nsCOMPtr uri = new NullPrincipalURI(*this); uri.forget(_newURI); return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::CloneIgnoringRef(nsIURI **_newURI) +NullPrincipalURI::CloneIgnoringRef(nsIURI** _newURI) { - // GetRef/SetRef not supported by nsNullPrincipalURI, so + // GetRef/SetRef not supported by NullPrincipalURI, so // CloneIgnoringRef() is the same as Clone(). return Clone(_newURI); } NS_IMETHODIMP -nsNullPrincipalURI::CloneWithNewRef(const nsACString& newRef, nsIURI **_newURI) +NullPrincipalURI::CloneWithNewRef(const nsACString& newRef, nsIURI** _newURI) { - // GetRef/SetRef not supported by nsNullPrincipalURI, so + // GetRef/SetRef not supported by NullPrincipalURI, so // CloneWithNewRef() is the same as Clone(). return Clone(_newURI); } NS_IMETHODIMP -nsNullPrincipalURI::Equals(nsIURI *aOther, bool *_equals) +NullPrincipalURI::Equals(nsIURI* aOther, bool* _equals) { *_equals = false; - RefPtr otherURI; + RefPtr otherURI; nsresult rv = aOther->QueryInterface(kNullPrincipalURIImplementationCID, getter_AddRefs(otherURI)); if (NS_SUCCEEDED(rv)) { @@ -327,23 +327,23 @@ nsNullPrincipalURI::Equals(nsIURI *aOther, bool *_equals) } NS_IMETHODIMP -nsNullPrincipalURI::EqualsExceptRef(nsIURI *aOther, bool *_equals) +NullPrincipalURI::EqualsExceptRef(nsIURI* aOther, bool* _equals) { - // GetRef/SetRef not supported by nsNullPrincipalURI, so + // GetRef/SetRef not supported by NullPrincipalURI, so // EqualsExceptRef() is the same as Equals(). return Equals(aOther, _equals); } NS_IMETHODIMP -nsNullPrincipalURI::Resolve(const nsACString &aRelativePath, - nsACString &_resolvedURI) +NullPrincipalURI::Resolve(const nsACString& aRelativePath, + nsACString& _resolvedURI) { _resolvedURI = aRelativePath; return NS_OK; } NS_IMETHODIMP -nsNullPrincipalURI::SchemeIs(const char *aScheme, bool *_schemeIs) +NullPrincipalURI::SchemeIs(const char* aScheme, bool* _schemeIs) { *_schemeIs = (0 == nsCRT::strcasecmp(NS_NULLPRINCIPAL_SCHEME, aScheme)); return NS_OK; @@ -353,13 +353,13 @@ nsNullPrincipalURI::SchemeIs(const char *aScheme, bool *_schemeIs) //// nsIIPCSerializableURI void -nsNullPrincipalURI::Serialize(mozilla::ipc::URIParams &aParams) +NullPrincipalURI::Serialize(mozilla::ipc::URIParams& aParams) { aParams = mozilla::ipc::NullPrincipalURIParams(); } bool -nsNullPrincipalURI::Deserialize(const mozilla::ipc::URIParams &aParams) +NullPrincipalURI::Deserialize(const mozilla::ipc::URIParams& aParams) { if (aParams.type() != mozilla::ipc::URIParams::TNullPrincipalURIParams) { MOZ_ASSERT_UNREACHABLE("unexpected URIParams type"); @@ -376,13 +376,13 @@ nsNullPrincipalURI::Deserialize(const mozilla::ipc::URIParams &aParams) //// nsISizeOf size_t -nsNullPrincipalURI::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const +NullPrincipalURI::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const { return mPath.SizeOfExcludingThisIfUnshared(aMallocSizeOf); } size_t -nsNullPrincipalURI::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const { +NullPrincipalURI::SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const +{ return aMallocSizeOf(this) + SizeOfExcludingThis(aMallocSizeOf); } - diff --git a/caps/nsNullPrincipalURI.h b/caps/NullPrincipalURI.h similarity index 73% rename from caps/nsNullPrincipalURI.h rename to caps/NullPrincipalURI.h index 63d7221c28320..fb4c60c0b4cbc 100644 --- a/caps/nsNullPrincipalURI.h +++ b/caps/NullPrincipalURI.h @@ -8,8 +8,8 @@ * This wraps nsSimpleURI so that all calls to it are done on the main thread. */ -#ifndef __nsNullPrincipalURI_h__ -#define __nsNullPrincipalURI_h__ +#ifndef __NullPrincipalURI_h__ +#define __NullPrincipalURI_h__ #include "nsIURI.h" #include "nsISizeOf.h" @@ -17,7 +17,7 @@ #include "mozilla/Attributes.h" #include "nsIIPCSerializableURI.h" #include "mozilla/MemoryReporting.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsID.h" // {51fcd543-3b52-41f7-b91b-6b54102236e6} @@ -25,9 +25,9 @@ {0x51fcd543, 0x3b52, 0x41f7, \ {0xb9, 0x1b, 0x6b, 0x54, 0x10, 0x22, 0x36, 0xe6} } -class nsNullPrincipalURI final : public nsIURI - , public nsISizeOf - , public nsIIPCSerializableURI +class NullPrincipalURI final : public nsIURI + , public nsISizeOf + , public nsIIPCSerializableURI { public: NS_DECL_THREADSAFE_ISUPPORTS @@ -40,15 +40,15 @@ class nsNullPrincipalURI final : public nsIURI // NB: This constructor exists only for deserialization. Everyone // else should call Create. - nsNullPrincipalURI(); + NullPrincipalURI(); // Returns null on failure. - static already_AddRefed Create(); + static already_AddRefed Create(); private: - nsNullPrincipalURI(const nsNullPrincipalURI& aOther); + NullPrincipalURI(const NullPrincipalURI& aOther); - ~nsNullPrincipalURI() {} + ~NullPrincipalURI() {} nsresult Init(); @@ -56,4 +56,4 @@ class nsNullPrincipalURI final : public nsIURI nsFixedCString mPath; }; -#endif // __nsNullPrincipalURI_h__ +#endif // __NullPrincipalURI_h__ diff --git a/caps/moz.build b/caps/moz.build index 3d5e52af97104..3da5ffbdce63d 100644 --- a/caps/moz.build +++ b/caps/moz.build @@ -25,8 +25,8 @@ XPIDL_MODULE = 'caps' EXPORTS += [ 'nsJSPrincipals.h', - 'nsNullPrincipal.h', - 'nsNullPrincipalURI.h', + 'NullPrincipal.h', + 'NullPrincipalURI.h', ] EXPORTS.mozilla = [ @@ -35,7 +35,7 @@ EXPORTS.mozilla = [ SOURCES += [ # Compile this separately since nsExceptionHandler.h conflicts - # with something from nsNullPrincipal.cpp. + # with something from NullPrincipal.cpp. 'BasePrincipal.cpp', ] @@ -43,11 +43,11 @@ UNIFIED_SOURCES += [ 'DomainPolicy.cpp', 'ExpandedPrincipal.cpp', 'nsJSPrincipals.cpp', - 'nsNullPrincipal.cpp', - 'nsNullPrincipalURI.cpp', 'nsPrincipal.cpp', 'nsScriptSecurityManager.cpp', 'nsSystemPrincipal.cpp', + 'NullPrincipal.cpp', + 'NullPrincipalURI.cpp', ] LOCAL_INCLUDES += [ diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index a3874ab22ce04..52b60331126c8 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -22,7 +22,7 @@ #include "mozilla/BasePrincipal.h" #include "nsSystemPrincipal.h" #include "nsPrincipal.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "DomainPolicy.h" #include "nsXPIDLString.h" #include "nsCRT.h" @@ -1141,7 +1141,7 @@ nsScriptSecurityManager::CreateNullPrincipal(JS::Handle aOriginAttrib if (!aOriginAttributes.isObject() || !attrs.Init(aCx, aOriginAttributes)) { return NS_ERROR_INVALID_ARG; } - nsCOMPtr prin = nsNullPrincipal::Create(attrs); + nsCOMPtr prin = NullPrincipal::Create(attrs); prin.forget(aPrincipal); return NS_OK; } diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 04fa021fcb79b..6ed2909fb70e1 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -120,7 +120,7 @@ #include "nsITimer.h" #include "nsISHistoryInternal.h" #include "nsIPrincipal.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsISHEntry.h" #include "nsIWindowWatcher.h" #include "nsIPromptFactory.h" @@ -1501,7 +1501,7 @@ nsDocShell::LoadURI(nsIURI* aURI, // // We didn't inherit OriginAttributes here as ExpandedPrincipal doesn't // have origin attributes. - principalToInherit = nsNullPrincipal::CreateWithInheritedAttributes(this); + principalToInherit = NullPrincipal::CreateWithInheritedAttributes(this); inheritPrincipal = false; } } @@ -1514,7 +1514,7 @@ nsDocShell::LoadURI(nsIURI* aURI, inheritPrincipal = false; // If aFirstParty is true and the pref 'privacy.firstparty.isolate' is // enabled, we will set firstPartyDomain on the origin attributes. - principalToInherit = nsNullPrincipal::CreateWithInheritedAttributes(this, aFirstParty); + principalToInherit = NullPrincipal::CreateWithInheritedAttributes(this, aFirstParty); } // If the triggeringPrincipal is not passed explicitly, we first try to create @@ -8127,9 +8127,9 @@ nsDocShell::CreateAboutBlankContentViewer(nsIPrincipal* aPrincipal, nsCOMPtr principal; if (mSandboxFlags & SANDBOXED_ORIGIN) { if (aPrincipal) { - principal = nsNullPrincipal::CreateWithInheritedAttributes(aPrincipal); + principal = NullPrincipal::CreateWithInheritedAttributes(aPrincipal); } else { - principal = nsNullPrincipal::CreateWithInheritedAttributes(this); + principal = NullPrincipal::CreateWithInheritedAttributes(this); } } else { principal = aPrincipal; @@ -12409,13 +12409,13 @@ nsDocShell::AddToSessionHistory(nsIURI* aURI, nsIChannel* aChannel, if (!principalToInherit) { if (loadInfo->GetLoadingSandboxed()) { if (loadInfo->LoadingPrincipal()) { - principalToInherit = nsNullPrincipal::CreateWithInheritedAttributes( + principalToInherit = NullPrincipal::CreateWithInheritedAttributes( loadInfo->LoadingPrincipal()); } else { // get the OriginAttributes OriginAttributes attrs; loadInfo->GetOriginAttributes(&attrs); - principalToInherit = nsNullPrincipal::Create(attrs); + principalToInherit = NullPrincipal::Create(attrs); } } else { principalToInherit = loadInfo->PrincipalToInherit(); @@ -12606,7 +12606,7 @@ nsDocShell::LoadHistoryEntry(nsISHEntry* aEntry, uint32_t aLoadType) // Ensure that we have a triggeringPrincipal. Otherwise javascript: // URIs will pick it up from the about:blank page we just loaded, // and we don't really want even that in this case. - triggeringPrincipal = nsNullPrincipal::CreateWithInheritedAttributes(this); + triggeringPrincipal = NullPrincipal::CreateWithInheritedAttributes(this); } } @@ -14378,7 +14378,7 @@ nsDocShell::GetPrintPreview(nsIWebBrowserPrint** aPrintPreview) // we QI the mContentViewer if the current URI is either about:blank // or about:printpreview. Stop(nsIWebNavigation::STOP_ALL); - nsCOMPtr principal = nsNullPrincipal::CreateWithInheritedAttributes(this); + nsCOMPtr principal = NullPrincipal::CreateWithInheritedAttributes(this); nsCOMPtr uri; NS_NewURI(getter_AddRefs(uri), NS_LITERAL_CSTRING("about:printpreview")); nsresult rv = CreateAboutBlankContentViewer(principal, uri); diff --git a/dom/base/DOMParser.cpp b/dom/base/DOMParser.cpp index 3d063369a49b1..da81cfc6b6722 100644 --- a/dom/base/DOMParser.cpp +++ b/dom/base/DOMParser.cpp @@ -18,7 +18,7 @@ #include "nsDOMJSUtils.h" #include "nsError.h" #include "nsPIDOMWindow.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "mozilla/LoadInfo.h" #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/ScriptSettings.h" @@ -345,7 +345,7 @@ DOMParser::Init(nsIPrincipal* principal, nsIURI* documentURI, // Don't give DOMParsers the system principal. Use a null // principal instead. mOriginalPrincipalWasSystem = true; - mPrincipal = nsNullPrincipal::Create(); + mPrincipal = NullPrincipal::Create(); if (!mDocumentURI) { rv = mPrincipal->GetURI(getter_AddRefs(mDocumentURI)); @@ -456,7 +456,7 @@ DOMParser::SetUpDocument(DocumentFlavor aFlavor, nsIDOMDocument** aResult) NS_ENSURE_TRUE(!mAttemptedInit, NS_ERROR_NOT_INITIALIZED); AttemptedInitMarker marker(&mAttemptedInit); - nsCOMPtr prin = nsNullPrincipal::Create(); + nsCOMPtr prin = NullPrincipal::Create(); rv = Init(prin, nullptr, nullptr, scriptHandlingObject); NS_ENSURE_SUCCESS(rv, rv); } diff --git a/dom/base/Location.cpp b/dom/base/Location.cpp index d93dee5f3f52b..6a269fe631e49 100644 --- a/dom/base/Location.cpp +++ b/dom/base/Location.cpp @@ -31,7 +31,7 @@ #include "nsGlobalWindow.h" #include "mozilla/Likely.h" #include "nsCycleCollectionParticipant.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "ScriptSettings.h" #include "mozilla/Unused.h" #include "mozilla/dom/LocationBinding.h" @@ -164,7 +164,7 @@ Location::CheckURL(nsIURI* aURI, nsIDocShellLoadInfo** aLoadInfo) sourceURI = docCurrentURI; } else { - // Use principalURI as long as it is not an nsNullPrincipalURI. We + // Use principalURI as long as it is not an NullPrincipalURI. We // could add a method such as GetReferrerURI to principals to make this // cleaner, but given that we need to start using Source Browsing // Context for referrer (see Bug 960639) this may be wasted effort at diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index f7e0c1c9b96e8..d3fa869985d84 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -182,7 +182,7 @@ #include "nsNetCID.h" #include "nsNetUtil.h" #include "nsNodeInfoManager.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsParserCIID.h" #include "nsParserConstants.h" #include "nsPIDOMWindow.h" @@ -514,7 +514,7 @@ nsContentUtils::Init() sSecurityManager->GetSystemPrincipal(&sSystemPrincipal); MOZ_ASSERT(sSystemPrincipal); - RefPtr nullPrincipal = nsNullPrincipal::Create(); + RefPtr nullPrincipal = NullPrincipal::Create(); if (!nullPrincipal) { return NS_ERROR_FAILURE; } @@ -4790,7 +4790,7 @@ nsContentUtils::ConvertToPlainText(const nsAString& aSourceBuffer, { nsCOMPtr uri; NS_NewURI(getter_AddRefs(uri), "about:blank"); - nsCOMPtr principal = nsNullPrincipal::Create(); + nsCOMPtr principal = NullPrincipal::Create(); nsCOMPtr domDocument; nsresult rv = NS_NewDOMDocument(getter_AddRefs(domDocument), EmptyString(), diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index b05ad121f5794..22da15285c34a 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -106,7 +106,7 @@ #include "nsIScriptSecurityManager.h" #include "nsIPermissionManager.h" #include "nsIPrincipal.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIDOMWindow.h" #include "nsPIDOMWindow.h" @@ -2723,7 +2723,7 @@ nsDocument::InitCSP(nsIChannel* aChannel) if (cspSandboxFlags & SANDBOXED_ORIGIN) { // If the new CSP sandbox flags do not have the allow-same-origin flag // reset the document principal to a null principal - principal = nsNullPrincipal::Create(); + principal = NullPrincipal::Create(); SetPrincipal(principal); } diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index 0217c97ffa546..052f77ab6df98 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -50,7 +50,7 @@ #include "nsIEditor.h" #include "nsIMozBrowserFrame.h" #include "nsISHistory.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIScriptError.h" #include "nsGlobalWindow.h" #include "nsPIWindowRoot.h" @@ -831,7 +831,7 @@ nsFrameLoader::ReallyStartLoadingInternal() NS_ENSURE_SUCCESS(rv, rv); } - // Use referrer as long as it is not an nsNullPrincipalURI. + // Use referrer as long as it is not an NullPrincipalURI. // We could add a method such as GetReferrerURI to principals to make this // cleaner, but given that we need to start using Source Browsing Context for // referrer (see Bug 960639) this may be wasted effort at this stage. diff --git a/dom/base/nsNodeInfoManager.cpp b/dom/base/nsNodeInfoManager.cpp index 66c8c84cfd316..b0169b82ba0e9 100644 --- a/dom/base/nsNodeInfoManager.cpp +++ b/dom/base/nsNodeInfoManager.cpp @@ -30,7 +30,7 @@ #include "nsCCUncollectableMarker.h" #include "nsNameSpaceManager.h" #include "nsDocument.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" using namespace mozilla; using mozilla::dom::NodeInfo; @@ -182,7 +182,7 @@ nsNodeInfoManager::Init(nsIDocument *aDocument) NS_PRECONDITION(!mPrincipal, "Being inited when we already have a principal?"); - mPrincipal = nsNullPrincipal::Create(); + mPrincipal = NullPrincipal::Create(); if (aDocument) { mBindingManager = new nsBindingManager(aDocument); diff --git a/dom/base/nsTreeSanitizer.cpp b/dom/base/nsTreeSanitizer.cpp index c234a15301baa..b9dd8e4e1db00 100644 --- a/dom/base/nsTreeSanitizer.cpp +++ b/dom/base/nsTreeSanitizer.cpp @@ -19,7 +19,7 @@ #include "nsIScriptSecurityManager.h" #include "nsNetUtil.h" #include "nsComponentManagerUtils.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsContentUtils.h" #include "nsIParserUtils.h" #include "nsIDocument.h" @@ -1522,7 +1522,7 @@ nsTreeSanitizer::InitializeStatics() sAttributesMathML->PutEntry(*kAttributesMathML[i]); } - nsCOMPtr principal = nsNullPrincipal::Create(); + nsCOMPtr principal = NullPrincipal::Create(); principal.forget(&sNullPrincipal); } diff --git a/dom/bindings/SimpleGlobalObject.cpp b/dom/bindings/SimpleGlobalObject.cpp index 5659138c852f0..2a9f5656c532c 100644 --- a/dom/bindings/SimpleGlobalObject.cpp +++ b/dom/bindings/SimpleGlobalObject.cpp @@ -10,7 +10,7 @@ #include "js/Class.h" #include "nsJSPrincipals.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsThreadUtils.h" #include "nsContentUtils.h" @@ -113,7 +113,7 @@ SimpleGlobalObject::Create(GlobalType globalType, JS::Handle proto) .setSystemZone(); if (NS_IsMainThread()) { - nsCOMPtr principal = nsNullPrincipal::Create(); + nsCOMPtr principal = NullPrincipal::Create(); options.creationOptions().setTrace(xpc::TraceXPCGlobal); global = xpc::CreateGlobalObject(cx, js::Jsvalify(&SimpleGlobalClass), nsJSPrincipals::get(principal), diff --git a/dom/json/nsJSON.cpp b/dom/json/nsJSON.cpp index 4a6503fb8eaf6..2884c7bc96f3e 100644 --- a/dom/json/nsJSON.cpp +++ b/dom/json/nsJSON.cpp @@ -22,7 +22,7 @@ #include "nsIScriptError.h" #include "nsCRTGlue.h" #include "nsIScriptSecurityManager.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "mozilla/Maybe.h" #include @@ -407,7 +407,7 @@ nsJSON::DecodeInternal(JSContext* cx, } nsresult rv; - nsCOMPtr nullPrincipal = nsNullPrincipal::Create(); + nsCOMPtr nullPrincipal = NullPrincipal::Create(); // The ::Decode function is deprecated [Bug 675797] and the following // channel is never openend, so it does not matter what securityFlags diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 7a81f835a0862..0fa7b7fd81d04 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -54,7 +54,7 @@ #include "VideoUtils.h" #include "Latency.h" #include "nsProxyRelease.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsVariant.h" // For snprintf @@ -1155,7 +1155,7 @@ class GetUserMediaStreamRunnable : public Runnable nsCOMPtr principal; if (mPeerIdentity) { - principal = nsNullPrincipal::CreateWithInheritedAttributes(window->GetExtantDoc()->NodePrincipal()); + principal = NullPrincipal::CreateWithInheritedAttributes(window->GetExtantDoc()->NodePrincipal()); } else { principal = window->GetExtantDoc()->NodePrincipal(); } diff --git a/dom/media/MediaStreamTrack.h b/dom/media/MediaStreamTrack.h index cb11e919ac2e9..c433f1a5656cb 100644 --- a/dom/media/MediaStreamTrack.h +++ b/dom/media/MediaStreamTrack.h @@ -97,7 +97,7 @@ class MediaStreamTrackSource : public nsISupports * This is used in WebRTC. A peerIdentity constrained MediaStreamTrack cannot * be sent across the network to anything other than a peer with the provided * identity. If this is set, then GetPrincipal() should return an instance of - * nsNullPrincipal. + * NullPrincipal. * * A track's PeerIdentity is immutable and will not change during the track's * lifetime. diff --git a/dom/plugins/base/nsPluginHost.cpp b/dom/plugins/base/nsPluginHost.cpp index 24816654569f4..3b8ace19e1ee7 100644 --- a/dom/plugins/base/nsPluginHost.cpp +++ b/dom/plugins/base/nsPluginHost.cpp @@ -94,7 +94,7 @@ #include "nsIImageLoadingContent.h" #include "mozilla/Preferences.h" #include "nsVersionComparator.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #if defined(XP_WIN) #include "nsIWindowMediator.h" diff --git a/dom/plugins/base/nsPluginStreamListenerPeer.cpp b/dom/plugins/base/nsPluginStreamListenerPeer.cpp index 283f1da7e277a..a6d0634fbdfcd 100644 --- a/dom/plugins/base/nsPluginStreamListenerPeer.cpp +++ b/dom/plugins/base/nsPluginStreamListenerPeer.cpp @@ -33,7 +33,7 @@ #include "GeckoProfiler.h" #include "nsPluginInstanceOwner.h" #include "nsDataHashtable.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #define BYTERANGE_REQUEST_CONTEXT 0x01020304 diff --git a/extensions/gio/nsGIOProtocolHandler.cpp b/extensions/gio/nsGIOProtocolHandler.cpp index 793f80267014f..eae6e1da0fe5d 100644 --- a/extensions/gio/nsGIOProtocolHandler.cpp +++ b/extensions/gio/nsGIOProtocolHandler.cpp @@ -24,7 +24,7 @@ #include "nsIChannel.h" #include "nsIInputStream.h" #include "nsIProtocolHandler.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "mozilla/Monitor.h" #include "plstr.h" #include "prtime.h" diff --git a/gfx/thebes/gfxSVGGlyphs.cpp b/gfx/thebes/gfxSVGGlyphs.cpp index 21e88212deabe..6276e882ddf79 100644 --- a/gfx/thebes/gfxSVGGlyphs.cpp +++ b/gfx/thebes/gfxSVGGlyphs.cpp @@ -16,7 +16,7 @@ #include "nsServiceManagerUtils.h" #include "nsIPresShell.h" #include "nsNetUtil.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIInputStream.h" #include "nsStringStream.h" #include "nsStreamUtils.h" @@ -359,7 +359,7 @@ gfxSVGGlyphsDocument::ParseDocument(const uint8_t *aBuffer, uint32_t aBufLen) rv = NS_NewURI(getter_AddRefs(uri), mSVGGlyphsDocumentURI); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr principal = nsNullPrincipal::Create(); + nsCOMPtr principal = NullPrincipal::Create(); nsCOMPtr domDoc; rv = NS_NewDOMDocument(getter_AddRefs(domDoc), diff --git a/image/decoders/icon/android/nsIconChannel.cpp b/image/decoders/icon/android/nsIconChannel.cpp index 5670bf2f95401..11d58ea20a898 100644 --- a/image/decoders/icon/android/nsIconChannel.cpp +++ b/image/decoders/icon/android/nsIconChannel.cpp @@ -13,7 +13,7 @@ #include "nsIStringStream.h" #include "nsNetUtil.h" #include "nsComponentManagerUtils.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" NS_IMPL_ISUPPORTS(nsIconChannel, nsIRequest, @@ -115,7 +115,7 @@ moz_icon_to_channel(nsIURI* aURI, const nsACString& aFileExt, // nsIconProtocolHandler::NewChannel2 will provide the correct loadInfo for // this iconChannel. Use the most restrictive security settings for the // temporary loadInfo to make sure the channel can not be openend. - nsCOMPtr nullPrincipal = nsNullPrincipal::Create(); + nsCOMPtr nullPrincipal = NullPrincipal::Create(); return NS_NewInputStreamChannel(aChannel, aURI, stream, diff --git a/image/decoders/icon/gtk/nsIconChannel.cpp b/image/decoders/icon/gtk/nsIconChannel.cpp index 3d3820e724654..c050a37ce93dd 100644 --- a/image/decoders/icon/gtk/nsIconChannel.cpp +++ b/image/decoders/icon/gtk/nsIconChannel.cpp @@ -27,7 +27,7 @@ #include "nsComponentManagerUtils.h" #include "nsIStringStream.h" #include "nsServiceManagerUtils.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIURL.h" #include "prlink.h" @@ -107,7 +107,7 @@ moz_gdk_pixbuf_to_channel(GdkPixbuf* aPixbuf, nsIURI* aURI, // nsIconProtocolHandler::NewChannel2 will provide the correct loadInfo for // this iconChannel. Use the most restrictive security settings for the // temporary loadInfo to make sure the channel can not be openend. - nsCOMPtr nullPrincipal = nsNullPrincipal::Create(); + nsCOMPtr nullPrincipal = NullPrincipal::Create(); return NS_NewInputStreamChannel(aChannel, aURI, stream, diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index a2936e1cfcc39..8ec75c5e026ba 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -17,7 +17,7 @@ #include "nsIURI.h" #include "nsNetUtil.h" #include "mozilla/LoadInfo.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsServiceManagerUtils.h" #include "nsString.h" #include "nsTArray.h" @@ -70,7 +70,7 @@ PrincipalInfoToPrincipal(const PrincipalInfo& aPrincipalInfo, return nullptr; } - principal = nsNullPrincipal::Create(info.attrs(), uri); + principal = NullPrincipal::Create(info.attrs(), uri); return principal.forget(); } diff --git a/ipc/glue/URIUtils.cpp b/ipc/glue/URIUtils.cpp index ec7656d74e8c4..b961310d33bb9 100644 --- a/ipc/glue/URIUtils.cpp +++ b/ipc/glue/URIUtils.cpp @@ -16,7 +16,7 @@ #include "nsJARURI.h" #include "nsIIconURI.h" #include "nsHostObjectURI.h" -#include "nsNullPrincipalURI.h" +#include "NullPrincipalURI.h" #include "nsJSProtocolHandler.h" #include "nsNetCID.h" #include "nsSimpleNestedURI.h" @@ -100,7 +100,7 @@ DeserializeURI(const URIParams& aParams) break; case URIParams::TNullPrincipalURIParams: - serializable = new nsNullPrincipalURI(); + serializable = new NullPrincipalURI(); break; case URIParams::TSimpleNestedURIParams: diff --git a/js/xpconnect/src/Sandbox.cpp b/js/xpconnect/src/Sandbox.cpp index 2a90b7ada490b..4c1d884c37251 100644 --- a/js/xpconnect/src/Sandbox.cpp +++ b/js/xpconnect/src/Sandbox.cpp @@ -19,7 +19,7 @@ #include "nsIURI.h" #include "nsJSUtils.h" #include "nsNetUtil.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "ExpandedPrincipal.h" #include "WrapperFactory.h" #include "xpcprivate.h" @@ -1049,7 +1049,7 @@ xpc::CreateSandboxObject(JSContext* cx, MutableHandleValue vp, nsISupports* prin if (sop) { principal = sop->GetPrincipal(); } else { - RefPtr nullPrin = nsNullPrincipal::Create(); + RefPtr nullPrin = NullPrincipal::Create(); principal = nullPrin; } } @@ -1784,7 +1784,7 @@ nsXPCComponents_utils_Sandbox::CallOrConstruct(nsIXPConnectWrappedNative* wrappe } } else if (args[0].isNull()) { // Null means that we just pass prinOrSop = nullptr, and get an - // nsNullPrincipal. + // NullPrincipal. ok = true; } diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index 064a0a2e184d8..705642aaf3d16 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -133,7 +133,7 @@ using mozilla::dom::AudioChannelAgent; #include "nsScriptSecurityManager.h" #include "nsPrincipal.h" #include "nsSystemPrincipal.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsNetCID.h" #ifndef MOZ_WIDGET_GONK #if defined(MOZ_WIDGET_ANDROID) @@ -593,7 +593,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsMixedContentBlocker) NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrincipal) NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsSystemPrincipal, nsScriptSecurityManager::SystemPrincipalSingletonConstructor) -NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsNullPrincipal, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NullPrincipal, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsStructuredCloneContainer) NS_GENERIC_FACTORY_CONSTRUCTOR(OSFileConstantsService) @@ -1029,7 +1029,7 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = { { &kNS_SCRIPTSECURITYMANAGER_CID, false, nullptr, Construct_nsIScriptSecurityManager }, { &kNS_PRINCIPAL_CID, false, nullptr, nsPrincipalConstructor }, { &kNS_SYSTEMPRINCIPAL_CID, false, nullptr, nsSystemPrincipalConstructor }, - { &kNS_NULLPRINCIPAL_CID, false, nullptr, nsNullPrincipalConstructor }, + { &kNS_NULLPRINCIPAL_CID, false, nullptr, NullPrincipalConstructor }, { &kNS_DEVICE_SENSORS_CID, false, nullptr, nsDeviceSensorsConstructor }, #ifndef MOZ_WIDGET_GONK #if defined(ANDROID) diff --git a/layout/style/CSSStyleSheet.cpp b/layout/style/CSSStyleSheet.cpp index 84d0f7c9f4763..6b1444c9e7d71 100644 --- a/layout/style/CSSStyleSheet.cpp +++ b/layout/style/CSSStyleSheet.cpp @@ -43,7 +43,7 @@ #include "nsDOMClassInfoID.h" #include "mozilla/Likely.h" #include "nsComponentManagerUtils.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "mozilla/RuleProcessorCache.h" #include "nsIStyleSheetLinkingElement.h" #include "nsDOMWindowUtils.h" diff --git a/layout/style/StyleSheet.cpp b/layout/style/StyleSheet.cpp index fdb901eb2e806..c0cc593b51dce 100644 --- a/layout/style/StyleSheet.cpp +++ b/layout/style/StyleSheet.cpp @@ -15,7 +15,7 @@ #include "mozAutoDocUpdate.h" #include "nsMediaList.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" namespace mozilla { @@ -202,7 +202,7 @@ StyleSheet::SetEnabled(bool aEnabled) StyleSheetInfo::StyleSheetInfo(CORSMode aCORSMode, ReferrerPolicy aReferrerPolicy, const dom::SRIMetadata& aIntegrity) - : mPrincipal(nsNullPrincipal::Create()) + : mPrincipal(NullPrincipal::Create()) , mCORSMode(aCORSMode) , mReferrerPolicy(aReferrerPolicy) , mIntegrity(aIntegrity) @@ -212,7 +212,7 @@ StyleSheetInfo::StyleSheetInfo(CORSMode aCORSMode, #endif { if (!mPrincipal) { - NS_RUNTIMEABORT("nsNullPrincipal::Init failed"); + NS_RUNTIMEABORT("NullPrincipal::Init failed"); } } diff --git a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp index 2ee486e90188a..d65ceda2ec6bb 100644 --- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp @@ -74,7 +74,7 @@ #include "nsIURLParser.h" #include "nsIDOMDataChannel.h" #include "nsIDOMLocation.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "mozilla/PeerIdentity.h" #include "mozilla/dom/RTCCertificate.h" #include "mozilla/dom/RTCConfigurationBinding.h" @@ -1877,7 +1877,7 @@ PeerConnectionImpl::CreateNewRemoteTracks(RefPtr& aPco) } else { // we're either certain that we need isolation for the streams, OR // we're not sure and we can fix the stream in SetDtlsConnected - principal = nsNullPrincipal::CreateWithInheritedAttributes(doc->NodePrincipal()); + principal = NullPrincipal::CreateWithInheritedAttributes(doc->NodePrincipal()); } // We need to select unique ids, just use max + 1 diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp index a11a35c3c3149..c9992f8123468 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp @@ -21,7 +21,7 @@ #include "nsContentUtils.h" #include "nsDocShell.h" #include "nsGlobalWindow.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" using namespace mozilla::dom; @@ -465,10 +465,10 @@ LoadInfo::GetSandboxedLoadingPrincipal(nsIPrincipal** aPrincipal) if (!mSandboxedLoadingPrincipal) { if (mLoadingPrincipal) { mSandboxedLoadingPrincipal = - nsNullPrincipal::CreateWithInheritedAttributes(mLoadingPrincipal); + NullPrincipal::CreateWithInheritedAttributes(mLoadingPrincipal); } else { OriginAttributes attrs(mOriginAttributes); - mSandboxedLoadingPrincipal = nsNullPrincipal::Create(attrs); + mSandboxedLoadingPrincipal = NullPrincipal::Create(attrs); } } MOZ_ASSERT(mSandboxedLoadingPrincipal); @@ -717,7 +717,7 @@ LoadInfo::ResetPrincipalsToNullPrincipal() // take the originAttributes from the LoadInfo and create // a new NullPrincipal using those origin attributes. nsCOMPtr newNullPrincipal = - nsNullPrincipal::Create(mOriginAttributes); + NullPrincipal::Create(mOriginAttributes); MOZ_ASSERT(mInternalContentPolicyType != nsIContentPolicy::TYPE_DOCUMENT || !mLoadingPrincipal, diff --git a/netwerk/protocol/ftp/nsFtpConnectionThread.cpp b/netwerk/protocol/ftp/nsFtpConnectionThread.cpp index 61c9d7fc1b1f4..d120890338a1d 100644 --- a/netwerk/protocol/ftp/nsFtpConnectionThread.cpp +++ b/netwerk/protocol/ftp/nsFtpConnectionThread.cpp @@ -41,7 +41,7 @@ #include "nsISocketTransportService.h" #include "nsIURI.h" #include "nsILoadInfo.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIAuthPrompt2.h" #include "nsIFTPChannelParentInternal.h" diff --git a/netwerk/protocol/http/nsCORSListenerProxy.cpp b/netwerk/protocol/http/nsCORSListenerProxy.cpp index d6579e14858e5..69e61bbbcc41b 100644 --- a/netwerk/protocol/http/nsCORSListenerProxy.cpp +++ b/netwerk/protocol/http/nsCORSListenerProxy.cpp @@ -39,7 +39,7 @@ #include "nsIDOMWindowUtils.h" #include "nsIDOMWindow.h" #include "nsINetworkInterceptController.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsICorsPreflightCallback.h" #include "nsISupportsImpl.h" #include "mozilla/LoadInfo.h" @@ -762,7 +762,7 @@ nsCORSListenerProxy::AsyncOnChannelRedirect(nsIChannel *aOldChannel, if (NS_SUCCEEDED(rv) && !equal) { // Spec says to set our source origin to a unique origin. mOriginHeaderPrincipal = - nsNullPrincipal::CreateWithInheritedAttributes(oldChannelPrincipal); + NullPrincipal::CreateWithInheritedAttributes(oldChannelPrincipal); } } diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp index f6ce07f4d8ac9..3d466d63799b5 100644 --- a/netwerk/protocol/http/nsHttpChannel.cpp +++ b/netwerk/protocol/http/nsHttpChannel.cpp @@ -92,7 +92,7 @@ #include "nsIHttpPushListener.h" #include "nsIX509Cert.h" #include "ScopedNSSTypes.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIDeprecationWarner.h" #include "nsIDocument.h" #include "nsIDOMDocument.h" diff --git a/netwerk/protocol/viewsource/nsViewSourceChannel.cpp b/netwerk/protocol/viewsource/nsViewSourceChannel.cpp index 324aae069e5a3..cfa4eceff6250 100644 --- a/netwerk/protocol/viewsource/nsViewSourceChannel.cpp +++ b/netwerk/protocol/viewsource/nsViewSourceChannel.cpp @@ -11,7 +11,7 @@ #include "nsContentUtils.h" #include "nsIHttpHeaderVisitor.h" #include "nsContentSecurityManager.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsServiceManagerUtils.h" #include "nsIInputStreamChannel.h" #include "mozilla/DebugOnly.h" @@ -67,7 +67,7 @@ nsViewSourceChannel::Init(nsIURI* uri) // Until then we follow the principal of least privilege and use // nullPrincipal as the loadingPrincipal and the least permissive // securityflag. - nsCOMPtr nullPrincipal = nsNullPrincipal::Create(); + nsCOMPtr nullPrincipal = NullPrincipal::Create(); rv = pService->NewChannel2(path, nullptr, // aOriginCharset diff --git a/parser/html/nsParserUtils.cpp b/parser/html/nsParserUtils.cpp index 6e9b9c296fb0a..bf4ca6546b6fc 100644 --- a/parser/html/nsParserUtils.cpp +++ b/parser/html/nsParserUtils.cpp @@ -36,7 +36,7 @@ #include "nsTreeSanitizer.h" #include "nsHtml5Module.h" #include "mozilla/dom/DocumentFragment.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #define XHTML_DIV_TAG "div xmlns=\"http://www.w3.org/1999/xhtml\"" @@ -76,7 +76,7 @@ nsParserUtils::Sanitize(const nsAString& aFromStr, { nsCOMPtr uri; NS_NewURI(getter_AddRefs(uri), "about:blank"); - nsCOMPtr principal = nsNullPrincipal::Create(); + nsCOMPtr principal = NullPrincipal::Create(); nsCOMPtr domDocument; nsresult rv = NS_NewDOMDocument(getter_AddRefs(domDocument), EmptyString(), diff --git a/parser/htmlparser/nsExpatDriver.cpp b/parser/htmlparser/nsExpatDriver.cpp index df4bfbb96052d..eb3e16ce83ec9 100644 --- a/parser/htmlparser/nsExpatDriver.cpp +++ b/parser/htmlparser/nsExpatDriver.cpp @@ -27,7 +27,7 @@ #include "nsXPCOMCIDInternal.h" #include "nsUnicharInputStream.h" #include "nsContentUtils.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "mozilla/Logging.h" #include "mozilla/SizePrintfMacros.h" @@ -793,7 +793,7 @@ nsExpatDriver::OpenInputStreamFromExternalDTD(const char16_t* aFPIStr, } } if (!loadingPrincipal) { - loadingPrincipal = nsNullPrincipal::Create(); + loadingPrincipal = NullPrincipal::Create(); } rv = NS_NewChannel(getter_AddRefs(channel), uri, diff --git a/parser/xml/nsSAXXMLReader.cpp b/parser/xml/nsSAXXMLReader.cpp index a84e0d63ba91c..363f7bfea2e2b 100644 --- a/parser/xml/nsSAXXMLReader.cpp +++ b/parser/xml/nsSAXXMLReader.cpp @@ -6,7 +6,7 @@ #include "nsIInputStream.h" #include "nsNetCID.h" #include "nsNetUtil.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" #include "nsIParser.h" #include "nsParserCIID.h" #include "nsStreamUtils.h" @@ -496,7 +496,7 @@ nsSAXXMLReader::ParseFromStream(nsIInputStream *aStream, rv = EnsureBaseURI(); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr nullPrincipal = nsNullPrincipal::Create(); + nsCOMPtr nullPrincipal = NullPrincipal::Create(); // The following channel is never openend, so it does not matter what // securityFlags we pass; let's follow the principle of least privilege. diff --git a/rdf/base/nsRDFXMLParser.cpp b/rdf/base/nsRDFXMLParser.cpp index f8237356bd3b9..6975522ef0c4c 100644 --- a/rdf/base/nsRDFXMLParser.cpp +++ b/rdf/base/nsRDFXMLParser.cpp @@ -13,7 +13,7 @@ #include "nsParserCIID.h" #include "nsStringStream.h" #include "nsNetUtil.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" static NS_DEFINE_CID(kParserCID, NS_PARSER_CID); @@ -113,7 +113,7 @@ nsRDFXMLParser::ParseString(nsIRDFDataSource* aSink, nsIURI* aBaseURI, const nsA rv = NS_NewCStringInputStream(getter_AddRefs(stream), aString); if (NS_FAILED(rv)) return rv; - nsCOMPtr nullPrincipal = nsNullPrincipal::Create(); + nsCOMPtr nullPrincipal = NullPrincipal::Create(); // The following channel is never openend, so it does not matter what // securityFlags we pass; let's follow the principle of least privilege. diff --git a/toolkit/components/places/nsFaviconService.cpp b/toolkit/components/places/nsFaviconService.cpp index 42526b2857244..2bf6672d17c4f 100644 --- a/toolkit/components/places/nsFaviconService.cpp +++ b/toolkit/components/places/nsFaviconService.cpp @@ -31,7 +31,7 @@ #include "nsILoadInfo.h" #include "nsIContentPolicy.h" #include "nsContentUtils.h" -#include "nsNullPrincipal.h" +#include "NullPrincipal.h" // For large favicons optimization. #include "imgITools.h" @@ -240,7 +240,7 @@ nsFaviconService::SetAndFetchFaviconForPage(nsIURI* aPageURI, nsContentUtils::eNECKO_PROPERTIES, "APIDeprecationWarning", params, ArrayLength(params)); - loadingPrincipal = nsNullPrincipal::Create(); + loadingPrincipal = NullPrincipal::Create(); } NS_ENSURE_TRUE(loadingPrincipal, NS_ERROR_FAILURE); @@ -402,7 +402,7 @@ nsFaviconService::ReplaceFaviconDataFromDataURL(nsIURI* aFaviconURI, "APIDeprecationWarning", params, ArrayLength(params)); - loadingPrincipal = nsNullPrincipal::Create(); + loadingPrincipal = NullPrincipal::Create(); } NS_ENSURE_TRUE(loadingPrincipal, NS_ERROR_FAILURE); From 412b37bdd52806030bec93885b314f9d9b8c5580 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 22 Mar 2017 11:39:08 +0100 Subject: [PATCH 234/300] Bug 1343933 - Renaming Principal classes - part 3 - SystemPrincipal, r=qdot --- ...ystemPrincipal.cpp => SystemPrincipal.cpp} | 48 +++++++++---------- ...{nsSystemPrincipal.h => SystemPrincipal.h} | 17 +++---- caps/moz.build | 2 +- caps/nsIPrincipal.idl | 2 +- caps/nsScriptSecurityManager.cpp | 8 ++-- caps/nsScriptSecurityManager.h | 4 +- layout/build/nsLayoutModule.cpp | 6 +-- 7 files changed, 44 insertions(+), 43 deletions(-) rename caps/{nsSystemPrincipal.cpp => SystemPrincipal.cpp} (66%) rename caps/{nsSystemPrincipal.h => SystemPrincipal.h} (82%) diff --git a/caps/nsSystemPrincipal.cpp b/caps/SystemPrincipal.cpp similarity index 66% rename from caps/nsSystemPrincipal.cpp rename to caps/SystemPrincipal.cpp index b1c33553ac8d9..0f03793c552c3 100644 --- a/caps/nsSystemPrincipal.cpp +++ b/caps/SystemPrincipal.cpp @@ -6,7 +6,7 @@ /* The privileged system principal. */ #include "nscore.h" -#include "nsSystemPrincipal.h" +#include "SystemPrincipal.h" #include "nsIComponentManager.h" #include "nsIServiceManager.h" #include "nsIURL.h" @@ -19,28 +19,28 @@ #include "nsIScriptSecurityManager.h" #include "pratom.h" -NS_IMPL_CLASSINFO(nsSystemPrincipal, nullptr, +NS_IMPL_CLASSINFO(SystemPrincipal, nullptr, nsIClassInfo::SINGLETON | nsIClassInfo::MAIN_THREAD_ONLY, NS_SYSTEMPRINCIPAL_CID) -NS_IMPL_QUERY_INTERFACE_CI(nsSystemPrincipal, +NS_IMPL_QUERY_INTERFACE_CI(SystemPrincipal, nsIPrincipal, nsISerializable) -NS_IMPL_CI_INTERFACE_GETTER(nsSystemPrincipal, +NS_IMPL_CI_INTERFACE_GETTER(SystemPrincipal, nsIPrincipal, nsISerializable) #define SYSTEM_PRINCIPAL_SPEC "[System Principal]" -already_AddRefed -nsSystemPrincipal::Create() +already_AddRefed +SystemPrincipal::Create() { - RefPtr sp = new nsSystemPrincipal(); + RefPtr sp = new SystemPrincipal(); sp->FinishInit(); return sp.forget(); } nsresult -nsSystemPrincipal::GetScriptLocation(nsACString &aStr) +SystemPrincipal::GetScriptLocation(nsACString &aStr) { aStr.AssignLiteral(SYSTEM_PRINCIPAL_SPEC); return NS_OK; @@ -51,35 +51,35 @@ nsSystemPrincipal::GetScriptLocation(nsACString &aStr) /////////////////////////////////////// NS_IMETHODIMP -nsSystemPrincipal::GetHashValue(uint32_t *result) +SystemPrincipal::GetHashValue(uint32_t *result) { *result = NS_PTR_TO_INT32(this); return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::GetURI(nsIURI** aURI) +SystemPrincipal::GetURI(nsIURI** aURI) { *aURI = nullptr; return NS_OK; } nsresult -nsSystemPrincipal::GetOriginInternal(nsACString& aOrigin) +SystemPrincipal::GetOriginInternal(nsACString& aOrigin) { aOrigin.AssignLiteral(SYSTEM_PRINCIPAL_SPEC); return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::GetCsp(nsIContentSecurityPolicy** aCsp) +SystemPrincipal::GetCsp(nsIContentSecurityPolicy** aCsp) { *aCsp = nullptr; return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) +SystemPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) { // Never destroy an existing CSP on the principal. // This method should only be called in rare cases. @@ -88,50 +88,50 @@ nsSystemPrincipal::SetCsp(nsIContentSecurityPolicy* aCsp) } NS_IMETHODIMP -nsSystemPrincipal::EnsureCSP(nsIDOMDocument* aDocument, - nsIContentSecurityPolicy** aCSP) +SystemPrincipal::EnsureCSP(nsIDOMDocument* aDocument, + nsIContentSecurityPolicy** aCSP) { // CSP on a system principal makes no sense return NS_ERROR_FAILURE; } NS_IMETHODIMP -nsSystemPrincipal::GetPreloadCsp(nsIContentSecurityPolicy** aPreloadCSP) +SystemPrincipal::GetPreloadCsp(nsIContentSecurityPolicy** aPreloadCSP) { *aPreloadCSP = nullptr; return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::EnsurePreloadCSP(nsIDOMDocument* aDocument, - nsIContentSecurityPolicy** aPreloadCSP) +SystemPrincipal::EnsurePreloadCSP(nsIDOMDocument* aDocument, + nsIContentSecurityPolicy** aPreloadCSP) { // CSP on a system principal makes no sense return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::GetDomain(nsIURI** aDomain) +SystemPrincipal::GetDomain(nsIURI** aDomain) { *aDomain = nullptr; return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::SetDomain(nsIURI* aDomain) +SystemPrincipal::SetDomain(nsIURI* aDomain) { return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::GetBaseDomain(nsACString& aBaseDomain) +SystemPrincipal::GetBaseDomain(nsACString& aBaseDomain) { // No base domain for chrome. return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::GetAddonId(nsAString& aAddonId) +SystemPrincipal::GetAddonId(nsAString& aAddonId) { aAddonId.Truncate(); return NS_OK; @@ -142,14 +142,14 @@ nsSystemPrincipal::GetAddonId(nsAString& aAddonId) ////////////////////////////////////////// NS_IMETHODIMP -nsSystemPrincipal::Read(nsIObjectInputStream* aStream) +SystemPrincipal::Read(nsIObjectInputStream* aStream) { // no-op: CID is sufficient to identify the mSystemPrincipal singleton return NS_OK; } NS_IMETHODIMP -nsSystemPrincipal::Write(nsIObjectOutputStream* aStream) +SystemPrincipal::Write(nsIObjectOutputStream* aStream) { // no-op: CID is sufficient to identify the mSystemPrincipal singleton return NS_OK; diff --git a/caps/nsSystemPrincipal.h b/caps/SystemPrincipal.h similarity index 82% rename from caps/nsSystemPrincipal.h rename to caps/SystemPrincipal.h index 0e67ce45e4909..d542f578ef5b0 100644 --- a/caps/nsSystemPrincipal.h +++ b/caps/SystemPrincipal.h @@ -6,8 +6,8 @@ /* The privileged system principal. */ -#ifndef nsSystemPrincipal_h__ -#define nsSystemPrincipal_h__ +#ifndef SystemPrincipal_h +#define SystemPrincipal_h #include "nsIPrincipal.h" #include "nsJSPrincipals.h" @@ -20,15 +20,15 @@ #define NS_SYSTEMPRINCIPAL_CONTRACTID "@mozilla.org/systemprincipal;1" -class nsSystemPrincipal final : public mozilla::BasePrincipal +class SystemPrincipal final : public mozilla::BasePrincipal { - nsSystemPrincipal() + SystemPrincipal() : BasePrincipal(eSystemPrincipal) { } public: - static already_AddRefed Create(); + static already_AddRefed Create(); NS_DECL_NSISERIALIZABLE NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override; @@ -48,9 +48,10 @@ class nsSystemPrincipal final : public mozilla::BasePrincipal virtual nsresult GetScriptLocation(nsACString &aStr) override; protected: - virtual ~nsSystemPrincipal(void) {} + virtual ~SystemPrincipal(void) {} - bool SubsumesInternal(nsIPrincipal *aOther, DocumentDomainConsideration aConsideration) override + bool SubsumesInternal(nsIPrincipal *aOther, + DocumentDomainConsideration aConsideration) override { return true; } @@ -61,4 +62,4 @@ class nsSystemPrincipal final : public mozilla::BasePrincipal } }; -#endif // nsSystemPrincipal_h__ +#endif // SystemPrincipal_h diff --git a/caps/moz.build b/caps/moz.build index 3da5ffbdce63d..e15b1fa44323b 100644 --- a/caps/moz.build +++ b/caps/moz.build @@ -45,9 +45,9 @@ UNIFIED_SOURCES += [ 'nsJSPrincipals.cpp', 'nsPrincipal.cpp', 'nsScriptSecurityManager.cpp', - 'nsSystemPrincipal.cpp', 'NullPrincipal.cpp', 'NullPrincipalURI.cpp', + 'SystemPrincipal.cpp', ] LOCAL_INCLUDES += [ diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index a34853e376044..258aa384a9f5e 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -357,7 +357,7 @@ interface nsIPrincipal : nsISerializable }; /** - * If nsSystemPrincipal is too risky to use, but we want a principal to access + * If SystemPrincipal is too risky to use, but we want a principal to access * more than one origin, ExpandedPrincipals letting us define an array of * principals it subsumes. So script with an ExpandedPrincipals will gain * same origin access when at least one of its principals it contains gained diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 52b60331126c8..daa7e2bd7911f 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -20,7 +20,7 @@ #include "nspr.h" #include "nsJSPrincipals.h" #include "mozilla/BasePrincipal.h" -#include "nsSystemPrincipal.h" +#include "SystemPrincipal.h" #include "nsPrincipal.h" #include "NullPrincipal.h" #include "DomainPolicy.h" @@ -1335,7 +1335,7 @@ nsresult nsScriptSecurityManager::Init() NS_ENSURE_SUCCESS(rv, rv); // Create our system principal singleton - RefPtr system = nsSystemPrincipal::Create(); + RefPtr system = SystemPrincipal::Create(); mSystemPrincipal = system; @@ -1407,13 +1407,13 @@ nsScriptSecurityManager::InitStatics() // Currently this nsGenericFactory constructor is used only from FastLoad // (XPCOM object deserialization) code, when "creating" the system principal // singleton. -nsSystemPrincipal * +SystemPrincipal * nsScriptSecurityManager::SystemPrincipalSingletonConstructor() { nsIPrincipal *sysprin = nullptr; if (gScriptSecMan) NS_ADDREF(sysprin = gScriptSecMan->mSystemPrincipal); - return static_cast(sysprin); + return static_cast(sysprin); } struct IsWhitespace { diff --git a/caps/nsScriptSecurityManager.h b/caps/nsScriptSecurityManager.h index da20441dd60ab..d633c9a4a9414 100644 --- a/caps/nsScriptSecurityManager.h +++ b/caps/nsScriptSecurityManager.h @@ -24,7 +24,7 @@ class nsCString; class nsIIOService; class nsIStringBundle; -class nsSystemPrincipal; +class SystemPrincipal; namespace mozilla { class OriginAttributes; @@ -55,7 +55,7 @@ class nsScriptSecurityManager final : public nsIScriptSecurityManager, // Invoked exactly once, by XPConnect. static void InitStatics(); - static nsSystemPrincipal* + static SystemPrincipal* SystemPrincipalSingletonConstructor(); /** diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index 705642aaf3d16..f440939b98b9c 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -132,7 +132,7 @@ using mozilla::dom::AudioChannelAgent; #include "nsScriptSecurityManager.h" #include "nsPrincipal.h" -#include "nsSystemPrincipal.h" +#include "SystemPrincipal.h" #include "NullPrincipal.h" #include "nsNetCID.h" #ifndef MOZ_WIDGET_GONK @@ -591,7 +591,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(CSPService) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMixedContentBlocker) NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrincipal) -NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsSystemPrincipal, +NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(SystemPrincipal, nsScriptSecurityManager::SystemPrincipalSingletonConstructor) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NullPrincipal, Init) NS_GENERIC_FACTORY_CONSTRUCTOR(nsStructuredCloneContainer) @@ -1028,7 +1028,7 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = { { &kNS_CHILDPROCESSMESSAGEMANAGER_CID, false, nullptr, CreateChildMessageManager }, { &kNS_SCRIPTSECURITYMANAGER_CID, false, nullptr, Construct_nsIScriptSecurityManager }, { &kNS_PRINCIPAL_CID, false, nullptr, nsPrincipalConstructor }, - { &kNS_SYSTEMPRINCIPAL_CID, false, nullptr, nsSystemPrincipalConstructor }, + { &kNS_SYSTEMPRINCIPAL_CID, false, nullptr, SystemPrincipalConstructor }, { &kNS_NULLPRINCIPAL_CID, false, nullptr, NullPrincipalConstructor }, { &kNS_DEVICE_SENSORS_CID, false, nullptr, nsDeviceSensorsConstructor }, #ifndef MOZ_WIDGET_GONK From f22d23c2a3581f7c522ab143f3fdd3faa96a1b75 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 22 Mar 2017 11:39:31 +0100 Subject: [PATCH 235/300] Bug 1343933 - Renaming Principal classes - part 4 - ContentPrincipal, r=qdot --- caps/BasePrincipal.cpp | 4 +- .../{nsPrincipal.cpp => ContentPrincipal.cpp} | 47 ++++++++++--------- caps/{nsPrincipal.h => ContentPrincipal.h} | 15 +++--- caps/NullPrincipal.cpp | 4 +- caps/moz.build | 2 +- caps/nsScriptSecurityManager.cpp | 1 - dom/base/nsFrameLoader.cpp | 2 +- dom/ipc/TabParent.cpp | 2 +- dom/media/MediaManager.cpp | 1 - dom/security/nsCSPService.cpp | 1 - ipc/glue/BackgroundUtils.cpp | 2 +- layout/build/nsLayoutModule.cpp | 6 +-- layout/build/nsLayoutStatics.cpp | 4 +- netwerk/base/nsIURI.idl | 2 +- netwerk/ipc/NeckoParent.cpp | 2 +- .../mozprofile/mozprofile/permissions.py | 7 +-- xpfe/appshell/nsContentTreeOwner.cpp | 2 +- 17 files changed, 53 insertions(+), 51 deletions(-) rename caps/{nsPrincipal.cpp => ContentPrincipal.cpp} (92%) rename caps/{nsPrincipal.h => ContentPrincipal.h} (85%) diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index 8ac83ef0c5850..f2a008208f098 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -16,7 +16,7 @@ #include "nsIObjectInputStream.h" #include "nsIObjectOutputStream.h" -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #include "nsNetUtil.h" #include "nsIURIWithPrincipal.h" #include "NullPrincipal.h" @@ -661,7 +661,7 @@ BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI, const OriginAttributes& aAt } // Mint a codebase principal. - RefPtr codebase = new nsPrincipal(); + RefPtr codebase = new ContentPrincipal(); rv = codebase->Init(aURI, aAttrs); NS_ENSURE_SUCCESS(rv, nullptr); return codebase.forget(); diff --git a/caps/nsPrincipal.cpp b/caps/ContentPrincipal.cpp similarity index 92% rename from caps/nsPrincipal.cpp rename to caps/ContentPrincipal.cpp index 80a03b9476b7f..127f6ce37f10f 100644 --- a/caps/nsPrincipal.cpp +++ b/caps/ContentPrincipal.cpp @@ -4,7 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #include "mozIThirdPartyUtil.h" #include "nscore.h" @@ -19,6 +19,8 @@ #include "nsJSPrincipals.h" #include "nsIEffectiveTLDService.h" #include "nsIClassInfoImpl.h" +#include "nsIObjectInputStream.h" +#include "nsIObjectOutputStream.h" #include "nsIProtocolHandler.h" #include "nsError.h" #include "nsIContentSecurityPolicy.h" @@ -58,25 +60,25 @@ GetAddonPolicyService(nsresult* aRv) return addonPolicyService; } -NS_IMPL_CLASSINFO(nsPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY, +NS_IMPL_CLASSINFO(ContentPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY, NS_PRINCIPAL_CID) -NS_IMPL_QUERY_INTERFACE_CI(nsPrincipal, +NS_IMPL_QUERY_INTERFACE_CI(ContentPrincipal, nsIPrincipal, nsISerializable) -NS_IMPL_CI_INTERFACE_GETTER(nsPrincipal, +NS_IMPL_CI_INTERFACE_GETTER(ContentPrincipal, nsIPrincipal, nsISerializable) // Called at startup: /* static */ void -nsPrincipal::InitializeStatics() +ContentPrincipal::InitializeStatics() { Preferences::AddBoolVarCache(&gCodeBasePrincipalSupport, "signed.applets.codebase_principal_support", false); } -nsPrincipal::nsPrincipal() +ContentPrincipal::ContentPrincipal() : BasePrincipal(eCodebasePrincipal) , mCodebaseImmutable(false) , mDomainImmutable(false) @@ -84,7 +86,7 @@ nsPrincipal::nsPrincipal() { } -nsPrincipal::~nsPrincipal() +ContentPrincipal::~ContentPrincipal() { // let's clear the principal within the csp to avoid a tangling pointer if (mCSP) { @@ -93,7 +95,8 @@ nsPrincipal::~nsPrincipal() } nsresult -nsPrincipal::Init(nsIURI *aCodebase, const OriginAttributes& aOriginAttributes) +ContentPrincipal::Init(nsIURI *aCodebase, + const OriginAttributes& aOriginAttributes) { NS_ENSURE_STATE(!mInitialized); NS_ENSURE_ARG(aCodebase); @@ -123,13 +126,13 @@ nsPrincipal::Init(nsIURI *aCodebase, const OriginAttributes& aOriginAttributes) } nsresult -nsPrincipal::GetScriptLocation(nsACString &aStr) +ContentPrincipal::GetScriptLocation(nsACString &aStr) { return mCodebase->GetSpec(aStr); } nsresult -nsPrincipal::GetOriginInternal(nsACString& aOrigin) +ContentPrincipal::GetOriginInternal(nsACString& aOrigin) { if (!mCodebase) { return NS_ERROR_FAILURE; @@ -249,12 +252,12 @@ nsPrincipal::GetOriginInternal(nsACString& aOrigin) } bool -nsPrincipal::SubsumesInternal(nsIPrincipal* aOther, - BasePrincipal::DocumentDomainConsideration aConsideration) +ContentPrincipal::SubsumesInternal(nsIPrincipal* aOther, + BasePrincipal::DocumentDomainConsideration aConsideration) { MOZ_ASSERT(aOther); - // For nsPrincipal, Subsumes is equivalent to Equals. + // For ContentPrincipal, Subsumes is equivalent to Equals. if (aOther == this) { return true; } @@ -286,7 +289,7 @@ nsPrincipal::SubsumesInternal(nsIPrincipal* aOther, } NS_IMETHODIMP -nsPrincipal::GetURI(nsIURI** aURI) +ContentPrincipal::GetURI(nsIURI** aURI) { if (mCodebaseImmutable) { NS_ADDREF(*aURI = mCodebase); @@ -302,7 +305,7 @@ nsPrincipal::GetURI(nsIURI** aURI) } bool -nsPrincipal::MayLoadInternal(nsIURI* aURI) +ContentPrincipal::MayLoadInternal(nsIURI* aURI) { // See if aURI is something like a Blob URI that is actually associated with // a principal. @@ -338,7 +341,7 @@ nsPrincipal::MayLoadInternal(nsIURI* aURI) } NS_IMETHODIMP -nsPrincipal::GetHashValue(uint32_t* aValue) +ContentPrincipal::GetHashValue(uint32_t* aValue) { NS_PRECONDITION(mCodebase, "Need a codebase"); @@ -347,7 +350,7 @@ nsPrincipal::GetHashValue(uint32_t* aValue) } NS_IMETHODIMP -nsPrincipal::GetDomain(nsIURI** aDomain) +ContentPrincipal::GetDomain(nsIURI** aDomain) { if (!mDomain) { *aDomain = nullptr; @@ -363,7 +366,7 @@ nsPrincipal::GetDomain(nsIURI** aDomain) } NS_IMETHODIMP -nsPrincipal::SetDomain(nsIURI* aDomain) +ContentPrincipal::SetDomain(nsIURI* aDomain) { mDomain = NS_TryToMakeImmutable(aDomain); mDomainImmutable = URIIsImmutable(mDomain); @@ -384,7 +387,7 @@ nsPrincipal::SetDomain(nsIURI* aDomain) } NS_IMETHODIMP -nsPrincipal::GetBaseDomain(nsACString& aBaseDomain) +ContentPrincipal::GetBaseDomain(nsACString& aBaseDomain) { // For a file URI, we return the file path. if (NS_URIIsLocalFile(mCodebase)) { @@ -419,7 +422,7 @@ nsPrincipal::GetBaseDomain(nsACString& aBaseDomain) } NS_IMETHODIMP -nsPrincipal::GetAddonId(nsAString& aAddonId) +ContentPrincipal::GetAddonId(nsAString& aAddonId) { if (mAddonIdCache.isSome()) { aAddonId.Assign(mAddonIdCache.ref()); @@ -448,7 +451,7 @@ nsPrincipal::GetAddonId(nsAString& aAddonId) }; NS_IMETHODIMP -nsPrincipal::Read(nsIObjectInputStream* aStream) +ContentPrincipal::Read(nsIObjectInputStream* aStream) { nsCOMPtr supports; nsCOMPtr codebase; @@ -494,7 +497,7 @@ nsPrincipal::Read(nsIObjectInputStream* aStream) } NS_IMETHODIMP -nsPrincipal::Write(nsIObjectOutputStream* aStream) +ContentPrincipal::Write(nsIObjectOutputStream* aStream) { NS_ENSURE_STATE(mCodebase); nsresult rv = NS_WriteOptionalCompoundObject(aStream, mCodebase, NS_GET_IID(nsIURI), diff --git a/caps/nsPrincipal.h b/caps/ContentPrincipal.h similarity index 85% rename from caps/nsPrincipal.h rename to caps/ContentPrincipal.h index f65dc81823d47..1acdafeda51db 100644 --- a/caps/nsPrincipal.h +++ b/caps/ContentPrincipal.h @@ -3,8 +3,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef nsPrincipal_h__ -#define nsPrincipal_h__ +#ifndef ContentPrincipal_h +#define ContentPrincipal_h #include "nsCOMPtr.h" #include "nsJSPrincipals.h" @@ -15,7 +15,7 @@ #include "nsScriptSecurityManager.h" #include "mozilla/BasePrincipal.h" -class nsPrincipal final : public mozilla::BasePrincipal +class ContentPrincipal final : public mozilla::BasePrincipal { public: NS_DECL_NSISERIALIZABLE @@ -29,7 +29,7 @@ class nsPrincipal final : public mozilla::BasePrincipal bool IsCodebasePrincipal() const override { return true; } nsresult GetOriginInternal(nsACString& aOrigin) override; - nsPrincipal(); + ContentPrincipal(); // Init() must be called before the principal is in a usable state. nsresult Init(nsIURI* aCodebase, @@ -50,9 +50,10 @@ class nsPrincipal final : public mozilla::BasePrincipal bool mInitialized; protected: - virtual ~nsPrincipal(); + virtual ~ContentPrincipal(); - bool SubsumesInternal(nsIPrincipal* aOther, DocumentDomainConsideration aConsideration) override; + bool SubsumesInternal(nsIPrincipal* aOther, + DocumentDomainConsideration aConsideration) override; bool MayLoadInternal(nsIURI* aURI) override; private: @@ -64,4 +65,4 @@ class nsPrincipal final : public mozilla::BasePrincipal { 0x653e0e4d, 0x3ee4, 0x45fa, \ { 0xb2, 0x72, 0x97, 0xc2, 0x0b, 0xc0, 0x1e, 0xb8 } } -#endif // nsPrincipal_h__ +#endif // ContentPrincipal_h diff --git a/caps/NullPrincipal.cpp b/caps/NullPrincipal.cpp index b3e4c745e63ad..8fff3211eb93b 100644 --- a/caps/NullPrincipal.cpp +++ b/caps/NullPrincipal.cpp @@ -21,7 +21,7 @@ #include "nsNetCID.h" #include "nsError.h" #include "nsIScriptSecurityManager.h" -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #include "nsScriptSecurityManager.h" #include "pratom.h" @@ -188,7 +188,7 @@ NullPrincipal::Read(nsIObjectInputStream* aStream) { // Note - NullPrincipal use NS_GENERIC_FACTORY_CONSTRUCTOR_INIT, which means // that the Init() method has already been invoked by the time we deserialize. - // This is in contrast to nsPrincipal, which uses NS_GENERIC_FACTORY_CONSTRUCTOR, + // This is in contrast to ContentPrincipal, which uses NS_GENERIC_FACTORY_CONSTRUCTOR, // in which case ::Read needs to invoke Init(). nsAutoCString spec; diff --git a/caps/moz.build b/caps/moz.build index e15b1fa44323b..2f3d6614cdf58 100644 --- a/caps/moz.build +++ b/caps/moz.build @@ -40,10 +40,10 @@ SOURCES += [ ] UNIFIED_SOURCES += [ + 'ContentPrincipal.cpp', 'DomainPolicy.cpp', 'ExpandedPrincipal.cpp', 'nsJSPrincipals.cpp', - 'nsPrincipal.cpp', 'nsScriptSecurityManager.cpp', 'NullPrincipal.cpp', 'NullPrincipalURI.cpp', diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index daa7e2bd7911f..0d587f8115a3c 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -21,7 +21,6 @@ #include "nsJSPrincipals.h" #include "mozilla/BasePrincipal.h" #include "SystemPrincipal.h" -#include "nsPrincipal.h" #include "NullPrincipal.h" #include "DomainPolicy.h" #include "nsXPIDLString.h" diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index 052f77ab6df98..e261b1860f41d 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -98,7 +98,7 @@ #include "mozilla/dom/Promise.h" #include "mozilla/dom/PromiseNativeHandler.h" -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #ifdef XP_WIN #include "mozilla/plugins/PPluginWidgetParent.h" diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index 06b69a77a49ad..87163e1bcb91c 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -58,7 +58,6 @@ #include "nsIDOMWindowUtils.h" #include "nsIInterfaceRequestorUtils.h" #include "nsILoadInfo.h" -#include "nsPrincipal.h" #include "nsIPromptFactory.h" #include "nsIURI.h" #include "nsIWindowWatcher.h" @@ -69,6 +68,7 @@ #include "nsViewManager.h" #include "nsVariant.h" #include "nsIWidget.h" +#include "nsNetUtil.h" #ifndef XP_WIN #include "nsJARProtocolHandler.h" #endif diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 0fa7b7fd81d04..2e37633254845 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -28,7 +28,6 @@ #include "nsIIDNService.h" #include "nsNetCID.h" #include "nsNetUtil.h" -#include "nsPrincipal.h" #include "nsICryptoHash.h" #include "nsICryptoHMAC.h" #include "nsIKeyModule.h" diff --git a/dom/security/nsCSPService.cpp b/dom/security/nsCSPService.cpp index b5bb2109f28e9..3aa3e0ed0e38f 100644 --- a/dom/security/nsCSPService.cpp +++ b/dom/security/nsCSPService.cpp @@ -20,7 +20,6 @@ #include "nsIScriptError.h" #include "nsContentUtils.h" #include "nsContentPolicyUtils.h" -#include "nsPrincipal.h" using namespace mozilla; diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index 8ec75c5e026ba..d7a99677b47e6 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -12,11 +12,11 @@ #include "mozilla/ipc/PBackgroundSharedTypes.h" #include "mozilla/net/NeckoChannelParams.h" #include "ExpandedPrincipal.h" -#include "nsPrincipal.h" #include "nsIScriptSecurityManager.h" #include "nsIURI.h" #include "nsNetUtil.h" #include "mozilla/LoadInfo.h" +#include "ContentPrincipal.h" #include "NullPrincipal.h" #include "nsServiceManagerUtils.h" #include "nsString.h" diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index f440939b98b9c..d6413ace24ea5 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -131,7 +131,7 @@ using mozilla::dom::AudioChannelAgent; #include "nsTextServicesCID.h" #include "nsScriptSecurityManager.h" -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #include "SystemPrincipal.h" #include "NullPrincipal.h" #include "nsNetCID.h" @@ -590,7 +590,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsCSPContext) NS_GENERIC_FACTORY_CONSTRUCTOR(CSPService) NS_GENERIC_FACTORY_CONSTRUCTOR(nsMixedContentBlocker) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsPrincipal) +NS_GENERIC_FACTORY_CONSTRUCTOR(ContentPrincipal) NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(SystemPrincipal, nsScriptSecurityManager::SystemPrincipalSingletonConstructor) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NullPrincipal, Init) @@ -1027,7 +1027,7 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = { { &kNS_PARENTPROCESSMESSAGEMANAGER_CID, false, nullptr, CreateParentMessageManager }, { &kNS_CHILDPROCESSMESSAGEMANAGER_CID, false, nullptr, CreateChildMessageManager }, { &kNS_SCRIPTSECURITYMANAGER_CID, false, nullptr, Construct_nsIScriptSecurityManager }, - { &kNS_PRINCIPAL_CID, false, nullptr, nsPrincipalConstructor }, + { &kNS_PRINCIPAL_CID, false, nullptr, ContentPrincipalConstructor }, { &kNS_SYSTEMPRINCIPAL_CID, false, nullptr, SystemPrincipalConstructor }, { &kNS_NULLPRINCIPAL_CID, false, nullptr, NullPrincipalConstructor }, { &kNS_DEVICE_SENSORS_CID, false, nullptr, nsDeviceSensorsConstructor }, diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp index 3247ed29bb8e4..e8e4826efb528 100644 --- a/layout/build/nsLayoutStatics.cpp +++ b/layout/build/nsLayoutStatics.cpp @@ -32,7 +32,7 @@ #include "nsImageFrame.h" #include "nsLayoutStylesheetCache.h" #include "mozilla/RuleProcessorCache.h" -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #include "nsRange.h" #include "nsRegion.h" #include "nsRepeatService.h" @@ -270,7 +270,7 @@ nsLayoutStatics::Initialize() nsLayoutUtils::Initialize(); nsIPresShell::InitializeStatics(); TouchManager::InitializeStatics(); - nsPrincipal::InitializeStatics(); + ContentPrincipal::InitializeStatics(); nsCORSListenerProxy::Startup(); diff --git a/netwerk/base/nsIURI.idl b/netwerk/base/nsIURI.idl index ef163813aa37c..2b903141921e5 100644 --- a/netwerk/base/nsIURI.idl +++ b/netwerk/base/nsIURI.idl @@ -63,7 +63,7 @@ * old (pre-gecko6) nsIURI IID and swap in the current IID instead, in order * for sessionstore to work after an upgrade. If this IID is revved further, * we will need to add additional checks there for all intermediate IIDs, until - * nsPrincipal is fixed to serialize its URIs as nsISupports (bug 662693). + * ContentPrincipal is fixed to serialize its URIs as nsISupports (bug 662693). */ [scriptable, uuid(92073a54-6d78-4f30-913a-b871813208c6)] interface nsIURI : nsISupports diff --git a/netwerk/ipc/NeckoParent.cpp b/netwerk/ipc/NeckoParent.cpp index b9aabe3fd05ed..3047860eae815 100644 --- a/netwerk/ipc/NeckoParent.cpp +++ b/netwerk/ipc/NeckoParent.cpp @@ -40,7 +40,7 @@ #include "SerializedLoadContext.h" #include "nsAuthInformationHolder.h" #include "nsIAuthPromptCallback.h" -#include "nsPrincipal.h" +#include "ContentPrincipal.h" #include "nsINetworkPredictor.h" #include "nsINetworkPredictorVerifier.h" #include "nsISpeculativeConnect.h" diff --git a/testing/mozbase/mozprofile/mozprofile/permissions.py b/testing/mozbase/mozprofile/mozprofile/permissions.py index ea13d96f021c4..2a0754c1be0af 100644 --- a/testing/mozbase/mozprofile/mozprofile/permissions.py +++ b/testing/mozbase/mozprofile/mozprofile/permissions.py @@ -274,9 +274,10 @@ def write_db(self, locations): permission_type = 2 if using_origin: - # This is a crude approximation of the origin generation logic from - # nsPrincipal and nsStandardURL. It should suffice for the permissions - # which the test runners will want to insert into the system. + # This is a crude approximation of the origin generation + # logic from ContentPrincipal and nsStandardURL. It should + # suffice for the permissions which the test runners will + # want to insert into the system. origin = location.scheme + "://" + location.host if (location.scheme != 'http' or location.port != '80') and \ (location.scheme != 'https' or location.port != '443'): diff --git a/xpfe/appshell/nsContentTreeOwner.cpp b/xpfe/appshell/nsContentTreeOwner.cpp index ff2524b8ab78a..155d305518018 100644 --- a/xpfe/appshell/nsContentTreeOwner.cpp +++ b/xpfe/appshell/nsContentTreeOwner.cpp @@ -763,7 +763,7 @@ NS_IMETHODIMP nsContentTreeOwner::SetTitle(const char16_t* aTitle) // // location bar is turned off, find the browser location // - // use the document's nsPrincipal to find the true owner + // use the document's ContentPrincipal to find the true owner // in case of javascript: or data: documents // nsCOMPtr dsitem; From 6d319a23f7f2d0aa4c8c5c130d5e85804e5814c9 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Wed, 22 Mar 2017 12:19:20 +0200 Subject: [PATCH 236/300] Bug 1346654, follow the COM rules in nsTextInputSelectionImpl, r=ehsan --- dom/html/nsTextEditorState.cpp | 74 ++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/dom/html/nsTextEditorState.cpp b/dom/html/nsTextEditorState.cpp index b574cb5946ef0..7c98e1e2696af 100644 --- a/dom/html/nsTextEditorState.cpp +++ b/dom/html/nsTextEditorState.cpp @@ -379,9 +379,10 @@ nsTextInputSelectionImpl::ScrollSelectionIntoView( if (!mFrameSelection) return NS_ERROR_FAILURE; - return mFrameSelection->ScrollSelectionIntoView( - ToSelectionType(aRawSelectionType), - aRegion, aFlags); + RefPtr frameSelection = mFrameSelection; + return frameSelection->ScrollSelectionIntoView( + ToSelectionType(aRawSelectionType), + aRegion, aFlags); } NS_IMETHODIMP @@ -390,7 +391,8 @@ nsTextInputSelectionImpl::RepaintSelection(RawSelectionType aRawSelectionType) if (!mFrameSelection) return NS_ERROR_FAILURE; - return mFrameSelection->RepaintSelection(ToSelectionType(aRawSelectionType)); + RefPtr frameSelection = mFrameSelection; + return frameSelection->RepaintSelection(ToSelectionType(aRawSelectionType)); } nsresult @@ -400,7 +402,8 @@ nsTextInputSelectionImpl::RepaintSelection(nsPresContext* aPresContext, if (!mFrameSelection) return NS_ERROR_FAILURE; - return mFrameSelection->RepaintSelection(aSelectionType); + RefPtr frameSelection = mFrameSelection; + return frameSelection->RepaintSelection(aSelectionType); } NS_IMETHODIMP @@ -487,48 +490,60 @@ NS_IMETHODIMP nsTextInputSelectionImpl::PhysicalMove(int16_t aDirection, int16_t aAmount, bool aExtend) { - if (mFrameSelection) - return mFrameSelection->PhysicalMove(aDirection, aAmount, aExtend); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->PhysicalMove(aDirection, aAmount, aExtend); + } return NS_ERROR_NULL_POINTER; } NS_IMETHODIMP nsTextInputSelectionImpl::CharacterMove(bool aForward, bool aExtend) { - if (mFrameSelection) - return mFrameSelection->CharacterMove(aForward, aExtend); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->CharacterMove(aForward, aExtend); + } return NS_ERROR_NULL_POINTER; } NS_IMETHODIMP nsTextInputSelectionImpl::CharacterExtendForDelete() { - if (mFrameSelection) - return mFrameSelection->CharacterExtendForDelete(); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->CharacterExtendForDelete(); + } return NS_ERROR_NULL_POINTER; } NS_IMETHODIMP nsTextInputSelectionImpl::CharacterExtendForBackspace() { - if (mFrameSelection) - return mFrameSelection->CharacterExtendForBackspace(); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->CharacterExtendForBackspace(); + } return NS_ERROR_NULL_POINTER; } NS_IMETHODIMP nsTextInputSelectionImpl::WordMove(bool aForward, bool aExtend) { - if (mFrameSelection) - return mFrameSelection->WordMove(aForward, aExtend); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->WordMove(aForward, aExtend); + } return NS_ERROR_NULL_POINTER; } NS_IMETHODIMP nsTextInputSelectionImpl::WordExtendForDelete(bool aForward) { - if (mFrameSelection) - return mFrameSelection->WordExtendForDelete(aForward); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->WordExtendForDelete(aForward); + } return NS_ERROR_NULL_POINTER; } @@ -537,7 +552,8 @@ nsTextInputSelectionImpl::LineMove(bool aForward, bool aExtend) { if (mFrameSelection) { - nsresult result = mFrameSelection->LineMove(aForward, aExtend); + RefPtr frameSelection = mFrameSelection; + nsresult result = frameSelection->LineMove(aForward, aExtend); if (NS_FAILED(result)) result = CompleteMove(aForward,aExtend); return result; @@ -549,8 +565,10 @@ nsTextInputSelectionImpl::LineMove(bool aForward, bool aExtend) NS_IMETHODIMP nsTextInputSelectionImpl::IntraLineMove(bool aForward, bool aExtend) { - if (mFrameSelection) - return mFrameSelection->IntraLineMove(aForward, aExtend); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->IntraLineMove(aForward, aExtend); + } return NS_ERROR_NULL_POINTER; } @@ -562,7 +580,8 @@ nsTextInputSelectionImpl::PageMove(bool aForward, bool aExtend) // and to remain relative position of the caret in view. see Bug 4302. if (mScrollFrame) { - mFrameSelection->CommonPageMove(aForward, aExtend, mScrollFrame); + RefPtr frameSelection = mFrameSelection; + frameSelection->CommonPageMove(aForward, aExtend, mScrollFrame); } // After ScrollSelectionIntoView(), the pending notifications might be // flushed and PresShell/PresContext/Frames may be dead. See bug 418470. @@ -590,8 +609,11 @@ nsTextInputSelectionImpl::CompleteScroll(bool aForward) NS_IMETHODIMP nsTextInputSelectionImpl::CompleteMove(bool aForward, bool aExtend) { + NS_ENSURE_STATE(mFrameSelection); + RefPtr frameSelection = mFrameSelection; + // grab the parent / root DIV for this text widget - nsIContent* parentDIV = mFrameSelection->GetLimiter(); + nsIContent* parentDIV = frameSelection->GetLimiter(); if (!parentDIV) return NS_ERROR_UNEXPECTED; @@ -617,7 +639,7 @@ nsTextInputSelectionImpl::CompleteMove(bool aForward, bool aExtend) } } - mFrameSelection->HandleClick(parentDIV, offset, offset, aExtend, + frameSelection->HandleClick(parentDIV, offset, offset, aExtend, false, hint); // if we got this far, attempt to scroll no matter what the above result is @@ -672,8 +694,10 @@ nsTextInputSelectionImpl::ScrollCharacter(bool aRight) NS_IMETHODIMP nsTextInputSelectionImpl::SelectAll() { - if (mFrameSelection) - return mFrameSelection->SelectAll(); + if (mFrameSelection) { + RefPtr frameSelection = mFrameSelection; + return frameSelection->SelectAll(); + } return NS_ERROR_NULL_POINTER; } From 1249d224ce2966ec78cd06bc9827c5c8645da038 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:13:38 +0100 Subject: [PATCH 237/300] Bug 1348660 - Part 1: Convert nsIQuotaUsageRequest result related attributes to a new structure nsIQuotaUsageResult and expose it using a new result attribute of type nsIVariant; r=btseng --- browser/base/content/pageinfo/permissions.js | 5 +- .../preferences/SiteDataManager.jsm | 2 +- .../tests/browser_advanced_siteData.js | 2 +- .../mochitest/test_cache_orphaned_body.html | 3 +- .../mochitest/test_cache_orphaned_cache.html | 3 +- .../test/mochitest/test_cache_shrink.html | 3 +- dom/indexedDB/test/file.js | 2 +- .../test/unit/test_idle_maintenance.js | 10 ++-- .../test/unit/xpcshell-head-parent-process.js | 2 +- dom/quota/ActorsChild.cpp | 12 +++-- dom/quota/QuotaRequests.cpp | 44 +++------------ dom/quota/QuotaRequests.h | 8 +-- dom/quota/QuotaResults.cpp | 54 +++++++++++++++++++ dom/quota/QuotaResults.h | 40 ++++++++++++++ dom/quota/StorageManager.cpp | 22 +++++--- dom/quota/moz.build | 2 + dom/quota/nsIQuotaRequests.idl | 11 ++-- dom/quota/nsIQuotaResults.idl | 17 ++++++ dom/quota/test/unit/head.js | 2 +- 19 files changed, 174 insertions(+), 70 deletions(-) create mode 100644 dom/quota/QuotaResults.cpp create mode 100644 dom/quota/QuotaResults.h create mode 100644 dom/quota/nsIQuotaResults.idl diff --git a/browser/base/content/pageinfo/permissions.js b/browser/base/content/pageinfo/permissions.js index 16a0af7318db6..7b8487c0df3e3 100644 --- a/browser/base/content/pageinfo/permissions.js +++ b/browser/base/content/pageinfo/permissions.js @@ -218,7 +218,8 @@ function onIndexedDBUsageCallback(request) { throw new Error("Callback received for bad URI: " + uri); } - if (request.usage) { + let usage = request.result.usage; + if (usage) { if (!("DownloadUtils" in window)) { Components.utils.import("resource://gre/modules/DownloadUtils.jsm"); } @@ -228,7 +229,7 @@ function onIndexedDBUsageCallback(request) { status.value = gBundle.getFormattedString("indexedDBUsage", - DownloadUtils.convertByteUnits(request.usage)); + DownloadUtils.convertByteUnits(usage)); status.removeAttribute("hidden"); button.removeAttribute("hidden"); } diff --git a/browser/components/preferences/SiteDataManager.jsm b/browser/components/preferences/SiteDataManager.jsm index 2f1ba38e5b39c..b48faac12c9b8 100644 --- a/browser/components/preferences/SiteDataManager.jsm +++ b/browser/components/preferences/SiteDataManager.jsm @@ -83,7 +83,7 @@ this.SiteDataManager = { promises.push(new Promise(resolve => { let callback = { onUsageResult(request) { - site.quotaUsage = request.usage; + site.quotaUsage = request.result.usage; resolve(); } }; diff --git a/browser/components/preferences/in-content/tests/browser_advanced_siteData.js b/browser/components/preferences/in-content/tests/browser_advanced_siteData.js index 759ba2aeac8bf..0d1f5062df320 100644 --- a/browser/components/preferences/in-content/tests/browser_advanced_siteData.js +++ b/browser/components/preferences/in-content/tests/browser_advanced_siteData.js @@ -132,7 +132,7 @@ function getQuotaUsage(origin) { return new Promise(resolve => { let uri = NetUtil.newURI(origin); let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {}); - Services.qms.getUsageForPrincipal(principal, request => resolve(request.usage)); + Services.qms.getUsageForPrincipal(principal, request => resolve(request.result.usage)); }); } diff --git a/dom/cache/test/mochitest/test_cache_orphaned_body.html b/dom/cache/test/mochitest/test_cache_orphaned_body.html index a806cb30005f0..049a97a794217 100644 --- a/dom/cache/test/mochitest/test_cache_orphaned_body.html +++ b/dom/cache/test/mochitest/test_cache_orphaned_body.html @@ -37,7 +37,8 @@ var qms = SpecialPowers.Services.qms; var principal = SpecialPowers.wrap(document).nodePrincipal; var cb = SpecialPowers.wrapCallback(function(request) { - resolve(request.usage, request.fileUsage); + var result = request.result; + resolve(result.usage, result.fileUsage); }); qms.getUsageForPrincipal(principal, cb); }); diff --git a/dom/cache/test/mochitest/test_cache_orphaned_cache.html b/dom/cache/test/mochitest/test_cache_orphaned_cache.html index c797da7b2f75f..c6086e4877fc0 100644 --- a/dom/cache/test/mochitest/test_cache_orphaned_cache.html +++ b/dom/cache/test/mochitest/test_cache_orphaned_cache.html @@ -37,7 +37,8 @@ var qms = SpecialPowers.Services.qms; var principal = SpecialPowers.wrap(document).nodePrincipal; var cb = SpecialPowers.wrapCallback(function(request) { - resolve(request.usage, request.fileUsage); + var result = request.result; + resolve(result.usage, result.fileUsage); }); qms.getUsageForPrincipal(principal, cb); }); diff --git a/dom/cache/test/mochitest/test_cache_shrink.html b/dom/cache/test/mochitest/test_cache_shrink.html index e6b362eb2215a..b7136cb750f41 100644 --- a/dom/cache/test/mochitest/test_cache_shrink.html +++ b/dom/cache/test/mochitest/test_cache_shrink.html @@ -37,7 +37,8 @@ var qms = SpecialPowers.Services.qms; var principal = SpecialPowers.wrap(document).nodePrincipal; var cb = SpecialPowers.wrapCallback(function(request) { - resolve(request.usage, request.fileUsage); + var result = request.result; + resolve(result.usage, result.fileUsage); }); qms.getUsageForPrincipal(principal, cb); }); diff --git a/dom/indexedDB/test/file.js b/dom/indexedDB/test/file.js index 6c70eff1be259..ac574e254644a 100644 --- a/dom/indexedDB/test/file.js +++ b/dom/indexedDB/test/file.js @@ -220,7 +220,7 @@ function verifyWasmModule(module1, module2) function grabFileUsageAndContinueHandler(request) { - testGenerator.next(request.fileUsage); + testGenerator.next(request.result.fileUsage); } function getUsage(usageHandler) diff --git a/dom/indexedDB/test/unit/test_idle_maintenance.js b/dom/indexedDB/test/unit/test_idle_maintenance.js index 51bcf0b11c93c..a0cf01fd778db 100644 --- a/dom/indexedDB/test/unit/test_idle_maintenance.js +++ b/dom/indexedDB/test/unit/test_idle_maintenance.js @@ -122,8 +122,9 @@ function* testSteps() let usageBeforeMaintenance; quotaManagerService.getUsageForPrincipal(principal, (request) => { - ok(request.usage > 0, "Usage is non-zero"); - usageBeforeMaintenance = request.usage; + let usage = request.result.usage; + ok(usage > 0, "Usage is non-zero"); + usageBeforeMaintenance = usage; continueToNextStep(); }); yield undefined; @@ -155,8 +156,9 @@ function* testSteps() let usageAfterMaintenance; quotaManagerService.getUsageForPrincipal(principal, (request) => { - ok(request.usage > 0, "Usage is non-zero"); - usageAfterMaintenance = request.usage; + let usage = request.result.usage; + ok(usage > 0, "Usage is non-zero"); + usageAfterMaintenance = usage; continueToNextStep(); }); yield undefined; diff --git a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js index d56e8269cf8ae..0f45fac88df3c 100644 --- a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js +++ b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js @@ -516,7 +516,7 @@ function verifyWasmModule(module1, module2) function grabFileUsageAndContinueHandler(request) { - testGenerator.next(request.fileUsage); + testGenerator.next(request.result.fileUsage); } function getUsage(usageHandler) diff --git a/dom/quota/ActorsChild.cpp b/dom/quota/ActorsChild.cpp index ab900dc39e6eb..c9a44d8f0abaf 100644 --- a/dom/quota/ActorsChild.cpp +++ b/dom/quota/ActorsChild.cpp @@ -9,6 +9,7 @@ #include "nsVariant.h" #include "QuotaManagerService.h" #include "QuotaRequests.h" +#include "QuotaResults.h" namespace mozilla { namespace dom { @@ -146,9 +147,14 @@ QuotaUsageRequestChild::HandleResponse(const UsageResponse& aResponse) AssertIsOnOwningThread(); MOZ_ASSERT(mRequest); - mRequest->SetResult(aResponse.usage(), - aResponse.fileUsage(), - aResponse.limit()); + RefPtr result = new UsageResult(aResponse.usage(), + aResponse.fileUsage(), + aResponse.limit()); + + RefPtr variant = new nsVariant(); + variant->SetAsInterface(NS_GET_IID(nsIQuotaUsageResult), result); + + mRequest->SetResult(variant); } void diff --git a/dom/quota/QuotaRequests.cpp b/dom/quota/QuotaRequests.cpp index 10b36b04078dc..1f53b9aa50d5c 100644 --- a/dom/quota/QuotaRequests.cpp +++ b/dom/quota/QuotaRequests.cpp @@ -95,9 +95,6 @@ UsageRequest::UsageRequest(nsIPrincipal* aPrincipal, nsIQuotaUsageCallback* aCallback) : RequestBase(aPrincipal) , mCallback(aCallback) - , mUsage(0) - , mFileUsage(0) - , mLimit(0) , mBackgroundActor(nullptr) , mCanceled(false) { @@ -126,14 +123,14 @@ UsageRequest::SetBackgroundActor(QuotaUsageRequestChild* aBackgroundActor) } void -UsageRequest::SetResult(uint64_t aUsage, uint64_t aFileUsage, uint64_t aLimit) +UsageRequest::SetResult(nsIVariant* aResult) { AssertIsOnOwningThread(); + MOZ_ASSERT(aResult); MOZ_ASSERT(!mHaveResultOrErrorCode); - mUsage = aUsage; - mFileUsage = aFileUsage; - mLimit = aLimit; + mResult = aResult; + mHaveResultOrErrorCode = true; FireCallback(); @@ -149,43 +146,18 @@ NS_IMPL_ADDREF_INHERITED(UsageRequest, RequestBase) NS_IMPL_RELEASE_INHERITED(UsageRequest, RequestBase) NS_IMETHODIMP -UsageRequest::GetUsage(uint64_t* aUsage) -{ - AssertIsOnOwningThread(); - - if (!mHaveResultOrErrorCode) { - return NS_ERROR_FAILURE; - } - - *aUsage = mUsage; - return NS_OK; -} - -NS_IMETHODIMP -UsageRequest::GetFileUsage(uint64_t* aFileUsage) +UsageRequest::GetResult(nsIVariant** aResult) { AssertIsOnOwningThread(); - MOZ_ASSERT(aFileUsage); + MOZ_ASSERT(aResult); if (!mHaveResultOrErrorCode) { return NS_ERROR_FAILURE; } - *aFileUsage = mFileUsage; - return NS_OK; -} - -NS_IMETHODIMP -UsageRequest::GetLimit(uint64_t* aLimit) -{ - AssertIsOnOwningThread(); - MOZ_ASSERT(aLimit); - - if (!mHaveResultOrErrorCode) { - return NS_ERROR_FAILURE; - } + MOZ_ASSERT(mResult); - *aLimit = mLimit; + NS_ADDREF(*aResult = mResult); return NS_OK; } diff --git a/dom/quota/QuotaRequests.h b/dom/quota/QuotaRequests.h index 37c276039278a..0fc2f096a43e6 100644 --- a/dom/quota/QuotaRequests.h +++ b/dom/quota/QuotaRequests.h @@ -72,11 +72,7 @@ class UsageRequest final { nsCOMPtr mCallback; - uint64_t mUsage; - uint64_t mFileUsage; - - // Group Limit. - uint64_t mLimit; + nsCOMPtr mResult; QuotaUsageRequestChild* mBackgroundActor; @@ -98,7 +94,7 @@ class UsageRequest final } void - SetResult(uint64_t aUsage, uint64_t aFileUsage, uint64_t aLimit); + SetResult(nsIVariant* aResult); NS_DECL_ISUPPORTS_INHERITED NS_FORWARD_NSIQUOTAREQUESTBASE(RequestBase::) diff --git a/dom/quota/QuotaResults.cpp b/dom/quota/QuotaResults.cpp new file mode 100644 index 0000000000000..55a1dd9332dc4 --- /dev/null +++ b/dom/quota/QuotaResults.cpp @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "QuotaResults.h" + +namespace mozilla { +namespace dom { +namespace quota { + +UsageResult::UsageResult(uint64_t aUsage, + uint64_t aFileUsage, + uint64_t aLimit) + : mUsage(aUsage) + , mFileUsage(aFileUsage) + , mLimit(aLimit) +{ +} + +NS_IMPL_ISUPPORTS(UsageResult, + nsIQuotaUsageResult) + +NS_IMETHODIMP +UsageResult::GetUsage(uint64_t* aUsage) +{ + MOZ_ASSERT(aUsage); + + *aUsage = mUsage; + return NS_OK; +} + +NS_IMETHODIMP +UsageResult::GetFileUsage(uint64_t* aFileUsage) +{ + MOZ_ASSERT(aFileUsage); + + *aFileUsage = mFileUsage; + return NS_OK; +} + +NS_IMETHODIMP +UsageResult::GetLimit(uint64_t* aLimit) +{ + MOZ_ASSERT(aLimit); + + *aLimit = mLimit; + return NS_OK; +} + +} // namespace quota +} // namespace dom +} // namespace mozilla diff --git a/dom/quota/QuotaResults.h b/dom/quota/QuotaResults.h new file mode 100644 index 0000000000000..d32e245faa574 --- /dev/null +++ b/dom/quota/QuotaResults.h @@ -0,0 +1,40 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_quota_QuotaResults_h +#define mozilla_dom_quota_QuotaResults_h + +#include "nsIQuotaResults.h" + +namespace mozilla { +namespace dom { +namespace quota { + +class UsageResult + : public nsIQuotaUsageResult +{ + uint64_t mUsage; + uint64_t mFileUsage; + uint64_t mLimit; + +public: + UsageResult(uint64_t aUsage, + uint64_t aFileUsage, + uint64_t aLimit); + +private: + virtual ~UsageResult() + { } + + NS_DECL_ISUPPORTS + NS_DECL_NSIQUOTAUSAGERESULT +}; + +} // namespace quota +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_quota_QuotaResults_h diff --git a/dom/quota/StorageManager.cpp b/dom/quota/StorageManager.cpp index 988fac57409c3..1a4773825b660 100644 --- a/dom/quota/StorageManager.cpp +++ b/dom/quota/StorageManager.cpp @@ -133,20 +133,30 @@ GetStorageEstimate(nsIQuotaUsageRequest* aRequest, { MOZ_ASSERT(aRequest); - uint64_t usage; - nsresult rv = aRequest->GetUsage(&usage); + nsCOMPtr result; + nsresult rv = aRequest->GetResult(getter_AddRefs(result)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - uint64_t limit; - rv = aRequest->GetLimit(&limit); + nsID* iid; + nsCOMPtr supports; + rv = result->GetAsInterface(&iid, getter_AddRefs(supports)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - aStorageEstimate.mUsage.Construct() = usage; - aStorageEstimate.mQuota.Construct() = limit; + free(iid); + + nsCOMPtr usageResult = do_QueryInterface(supports); + MOZ_ASSERT(usageResult); + + MOZ_ALWAYS_SUCCEEDS( + usageResult->GetUsage(&aStorageEstimate.mUsage.Construct())); + + MOZ_ALWAYS_SUCCEEDS( + usageResult->GetLimit(&aStorageEstimate.mQuota.Construct())); + return NS_OK; } diff --git a/dom/quota/moz.build b/dom/quota/moz.build index dca28101d3db9..33c465666d4be 100644 --- a/dom/quota/moz.build +++ b/dom/quota/moz.build @@ -15,6 +15,7 @@ XPIDL_SOURCES += [ 'nsIQuotaCallbacks.idl', 'nsIQuotaManagerService.idl', 'nsIQuotaRequests.idl', + 'nsIQuotaResults.idl', ] XPIDL_MODULE = 'dom_quota' @@ -43,6 +44,7 @@ UNIFIED_SOURCES += [ 'FileStreams.cpp', 'QuotaManagerService.cpp', 'QuotaRequests.cpp', + 'QuotaResults.cpp', 'StorageManager.cpp', ] diff --git a/dom/quota/nsIQuotaRequests.idl b/dom/quota/nsIQuotaRequests.idl index 4a3d8547ae117..c8d39c3ed2a0a 100644 --- a/dom/quota/nsIQuotaRequests.idl +++ b/dom/quota/nsIQuotaRequests.idl @@ -22,11 +22,9 @@ interface nsIQuotaRequestBase : nsISupports [scriptable, uuid(166e28e6-cf6d-4927-a6d7-b51bca9d3469)] interface nsIQuotaUsageRequest : nsIQuotaRequestBase { - [must_use] readonly attribute unsigned long long usage; - - [must_use] readonly attribute unsigned long long fileUsage; - - [must_use] readonly attribute unsigned long long limit; + // The result can contain one of these types: + // nsIQuotaUsageResult + [must_use] readonly attribute nsIVariant result; attribute nsIQuotaUsageCallback callback; @@ -37,6 +35,9 @@ interface nsIQuotaUsageRequest : nsIQuotaRequestBase [scriptable, uuid(22890e3e-ff25-4372-9684-d901060e2f6c)] interface nsIQuotaRequest : nsIQuotaRequestBase { + // The result can contain one of these types: + // void + // bool [must_use] readonly attribute nsIVariant result; attribute nsIQuotaCallback callback; diff --git a/dom/quota/nsIQuotaResults.idl b/dom/quota/nsIQuotaResults.idl new file mode 100644 index 0000000000000..e8d05a20e6406 --- /dev/null +++ b/dom/quota/nsIQuotaResults.idl @@ -0,0 +1,17 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsISupports.idl" + +[scriptable, function, uuid(96df03d2-116a-493f-bb0b-118c212a6b32)] +interface nsIQuotaUsageResult : nsISupports +{ + readonly attribute unsigned long long usage; + + readonly attribute unsigned long long fileUsage; + + readonly attribute unsigned long long limit; +}; diff --git a/dom/quota/test/unit/head.js b/dom/quota/test/unit/head.js index e3606c47deceb..879c2cb7fc1f0 100644 --- a/dom/quota/test/unit/head.js +++ b/dom/quota/test/unit/head.js @@ -263,7 +263,7 @@ function getPersistedFromMetadata(readBuffer) function grabUsageAndContinueHandler(request) { - testGenerator.next(request.usage); + testGenerator.next(request.result.usage); } function getUsage(usageHandler) From 68a663b93f0ee14102aa45fc2faf6c7d47de7200 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:13:48 +0100 Subject: [PATCH 238/300] Bug 1348660 - Part 2: Rename usage related methods and structures to express the relation to a concrete origin; r=btseng --- dom/indexedDB/test/file.js | 2 +- dom/indexedDB/test/test_file_os_delete.html | 8 ++-- .../test/unit/test_view_put_get_values.js | 2 +- .../test/unit/xpcshell-head-parent-process.js | 2 +- dom/quota/ActorsChild.cpp | 15 ++++--- dom/quota/ActorsChild.h | 2 +- dom/quota/ActorsParent.cpp | 44 +++++++++---------- dom/quota/PQuota.ipdl | 4 +- dom/quota/PQuotaUsageRequest.ipdl | 4 +- dom/quota/QuotaManagerService.cpp | 2 +- dom/quota/QuotaResults.cpp | 16 +++---- dom/quota/QuotaResults.h | 14 +++--- dom/quota/StorageManager.cpp | 9 ++-- dom/quota/nsIQuotaRequests.idl | 2 +- dom/quota/nsIQuotaResults.idl | 2 +- dom/quota/test/unit/head.js | 2 +- dom/quota/test/unit/test_basics.js | 4 +- dom/quota/test/unit/test_unknownFiles.js | 6 +-- 18 files changed, 71 insertions(+), 69 deletions(-) diff --git a/dom/indexedDB/test/file.js b/dom/indexedDB/test/file.js index ac574e254644a..744a92b33a0c6 100644 --- a/dom/indexedDB/test/file.js +++ b/dom/indexedDB/test/file.js @@ -223,7 +223,7 @@ function grabFileUsageAndContinueHandler(request) testGenerator.next(request.result.fileUsage); } -function getUsage(usageHandler) +function getCurrentUsage(usageHandler) { let qms = SpecialPowers.Services.qms; let principal = SpecialPowers.wrap(document).nodePrincipal; diff --git a/dom/indexedDB/test/test_file_os_delete.html b/dom/indexedDB/test/test_file_os_delete.html index e5acf079c4206..81c8fd1a8c50c 100644 --- a/dom/indexedDB/test/test_file_os_delete.html +++ b/dom/indexedDB/test/test_file_os_delete.html @@ -18,7 +18,7 @@ const objectStoreName = "Blobs"; - getUsage(grabFileUsageAndContinueHandler); + getCurrentUsage(grabFileUsageAndContinueHandler); let startUsage = yield undefined; const fileData1 = { @@ -61,7 +61,7 @@ is(event.type, "success", "Got correct event type"); - getUsage(grabFileUsageAndContinueHandler); + getCurrentUsage(grabFileUsageAndContinueHandler); let usage = yield undefined; is(usage, startUsage + fileData1.obj.file.size + fileData2.obj.file.size, @@ -74,7 +74,7 @@ is(event.type, "complete", "Got correct event type"); - getUsage(grabFileUsageAndContinueHandler); + getCurrentUsage(grabFileUsageAndContinueHandler); usage = yield undefined; is(usage, startUsage + fileData1.obj.file.size + fileData2.obj.file.size, @@ -90,7 +90,7 @@ // Flush pending file deletions before checking usage. flushPendingFileDeletions(); - getUsage(grabFileUsageAndContinueHandler); + getCurrentUsage(grabFileUsageAndContinueHandler); let endUsage = yield undefined; is(endUsage, startUsage, "OS files deleted"); diff --git a/dom/indexedDB/test/unit/test_view_put_get_values.js b/dom/indexedDB/test/unit/test_view_put_get_values.js index 2dad2f64c6536..2b4b8bf060ce6 100644 --- a/dom/indexedDB/test/unit/test_view_put_get_values.js +++ b/dom/indexedDB/test/unit/test_view_put_get_values.js @@ -80,7 +80,7 @@ function* testSteps() verifyView(request.result, viewData.view); yield undefined; - getUsage(grabFileUsageAndContinueHandler); + getCurrentUsage(grabFileUsageAndContinueHandler); let fileUsage = yield undefined; if (external) { diff --git a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js index 0f45fac88df3c..ba757ba9a248d 100644 --- a/dom/indexedDB/test/unit/xpcshell-head-parent-process.js +++ b/dom/indexedDB/test/unit/xpcshell-head-parent-process.js @@ -519,7 +519,7 @@ function grabFileUsageAndContinueHandler(request) testGenerator.next(request.result.fileUsage); } -function getUsage(usageHandler) +function getCurrentUsage(usageHandler) { let qms = Cc["@mozilla.org/dom/quota-manager-service;1"] .getService(Ci.nsIQuotaManagerService); diff --git a/dom/quota/ActorsChild.cpp b/dom/quota/ActorsChild.cpp index c9a44d8f0abaf..ffb35104a8574 100644 --- a/dom/quota/ActorsChild.cpp +++ b/dom/quota/ActorsChild.cpp @@ -142,17 +142,18 @@ QuotaUsageRequestChild::HandleResponse(nsresult aResponse) } void -QuotaUsageRequestChild::HandleResponse(const UsageResponse& aResponse) +QuotaUsageRequestChild::HandleResponse(const OriginUsageResponse& aResponse) { AssertIsOnOwningThread(); MOZ_ASSERT(mRequest); - RefPtr result = new UsageResult(aResponse.usage(), - aResponse.fileUsage(), - aResponse.limit()); + RefPtr result = + new OriginUsageResult(aResponse.usage(), + aResponse.fileUsage(), + aResponse.limit()); RefPtr variant = new nsVariant(); - variant->SetAsInterface(NS_GET_IID(nsIQuotaUsageResult), result); + variant->SetAsInterface(NS_GET_IID(nsIQuotaOriginUsageResult), result); mRequest->SetResult(variant); } @@ -181,8 +182,8 @@ QuotaUsageRequestChild::Recv__delete__(const UsageRequestResponse& aResponse) HandleResponse(aResponse.get_nsresult()); break; - case UsageRequestResponse::TUsageResponse: - HandleResponse(aResponse.get_UsageResponse()); + case UsageRequestResponse::TOriginUsageResponse: + HandleResponse(aResponse.get_OriginUsageResponse()); break; default: diff --git a/dom/quota/ActorsChild.h b/dom/quota/ActorsChild.h index 90a952e3b65e5..4bc5e85a5f29f 100644 --- a/dom/quota/ActorsChild.h +++ b/dom/quota/ActorsChild.h @@ -98,7 +98,7 @@ class QuotaUsageRequestChild final HandleResponse(nsresult aResponse); void - HandleResponse(const UsageResponse& aResponse); + HandleResponse(const OriginUsageResponse& aResponse); // IPDL methods are only called by IPDL. virtual void diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index 22a3559d39bb3..68459c1d0a3d5 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -1042,7 +1042,7 @@ class Quota final RecvStopIdleMaintenance() override; }; -class GetUsageOp final +class GetOriginUsageOp final : public NormalOriginOperationBase , public PQuotaUsageRequestParent { @@ -1051,19 +1051,19 @@ class GetUsageOp final // limit. UsageInfo mUsageInfo; - const UsageParams mParams; + const OriginUsageParams mParams; nsCString mSuffix; nsCString mGroup; bool mGetGroupUsage; public: - explicit GetUsageOp(const UsageRequestParams& aParams); + explicit GetOriginUsageOp(const UsageRequestParams& aParams); MOZ_IS_CLASS_INIT bool Init(Quota* aQuota); private: - ~GetUsageOp() + ~GetOriginUsageOp() { } MOZ_IS_CLASS_INIT virtual nsresult @@ -6230,7 +6230,7 @@ Quota::ActorDestroy(ActorDestroyReason aWhy) PQuotaUsageRequestParent* Quota::AllocPQuotaUsageRequestParent(const UsageRequestParams& aParams) { - RefPtr actor = new GetUsageOp(aParams); + RefPtr actor = new GetOriginUsageOp(aParams); // Transfer ownership to IPDL. return actor.forget().take(); @@ -6244,7 +6244,7 @@ Quota::RecvPQuotaUsageRequestConstructor(PQuotaUsageRequestParent* aActor, MOZ_ASSERT(aActor); MOZ_ASSERT(aParams.type() != UsageRequestParams::T__None); - auto* op = static_cast(aActor); + auto* op = static_cast(aActor); if (NS_WARN_IF(!op->Init(this))) { return IPC_FAIL_NO_REASON(this); @@ -6261,8 +6261,8 @@ Quota::DeallocPQuotaUsageRequestParent(PQuotaUsageRequestParent* aActor) MOZ_ASSERT(aActor); // Transfer ownership back from IPDL. - RefPtr actor = - dont_AddRef(static_cast(aActor)); + RefPtr actor = + dont_AddRef(static_cast(aActor)); return true; } @@ -6414,19 +6414,19 @@ Quota::RecvStopIdleMaintenance() return IPC_OK(); } -GetUsageOp::GetUsageOp(const UsageRequestParams& aParams) +GetOriginUsageOp::GetOriginUsageOp(const UsageRequestParams& aParams) : NormalOriginOperationBase(Nullable(), OriginScope::FromNull(), /* aExclusive */ false) - , mParams(aParams.get_UsageParams()) - , mGetGroupUsage(aParams.get_UsageParams().getGroupUsage()) + , mParams(aParams.get_OriginUsageParams()) + , mGetGroupUsage(aParams.get_OriginUsageParams().getGroupUsage()) { AssertIsOnOwningThread(); - MOZ_ASSERT(aParams.type() == UsageRequestParams::TUsageParams); + MOZ_ASSERT(aParams.type() == UsageRequestParams::TOriginUsageParams); } bool -GetUsageOp::Init(Quota* aQuota) +GetOriginUsageOp::Init(Quota* aQuota) { AssertIsOnOwningThread(); MOZ_ASSERT(aQuota); @@ -6438,7 +6438,7 @@ GetUsageOp::Init(Quota* aQuota) } nsresult -GetUsageOp::DoInitOnMainThread() +GetOriginUsageOp::DoInitOnMainThread() { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(GetState() == State_Initializing); @@ -6467,8 +6467,8 @@ GetUsageOp::DoInitOnMainThread() } nsresult -GetUsageOp::AddToUsage(QuotaManager* aQuotaManager, - PersistenceType aPersistenceType) +GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, + PersistenceType aPersistenceType) { AssertIsOnIOThread(); @@ -6580,12 +6580,12 @@ GetUsageOp::AddToUsage(QuotaManager* aQuotaManager, } nsresult -GetUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) +GetOriginUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) { AssertIsOnIOThread(); MOZ_ASSERT(mUsageInfo.TotalUsage() == 0); - PROFILER_LABEL("Quota", "GetUsageOp::DoDirectoryWork", + PROFILER_LABEL("Quota", "GetOriginUsageOp::DoDirectoryWork", js::ProfileEntry::Category::OTHER); nsresult rv; @@ -6621,7 +6621,7 @@ GetUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) } void -GetUsageOp::SendResults() +GetOriginUsageOp::SendResults() { AssertIsOnOwningThread(); @@ -6637,7 +6637,7 @@ GetUsageOp::SendResults() UsageRequestResponse response; if (NS_SUCCEEDED(mResultCode)) { - UsageResponse usageResponse; + OriginUsageResponse usageResponse; // We'll get the group usage when mGetGroupUsage is true and get the // origin usage when mGetGroupUsage is false. @@ -6659,7 +6659,7 @@ GetUsageOp::SendResults() } void -GetUsageOp::ActorDestroy(ActorDestroyReason aWhy) +GetOriginUsageOp::ActorDestroy(ActorDestroyReason aWhy) { AssertIsOnOwningThread(); @@ -6667,7 +6667,7 @@ GetUsageOp::ActorDestroy(ActorDestroyReason aWhy) } mozilla::ipc::IPCResult -GetUsageOp::RecvCancel() +GetOriginUsageOp::RecvCancel() { AssertIsOnOwningThread(); diff --git a/dom/quota/PQuota.ipdl b/dom/quota/PQuota.ipdl index 88333e5bee6ba..29ec3ae3e546e 100644 --- a/dom/quota/PQuota.ipdl +++ b/dom/quota/PQuota.ipdl @@ -27,7 +27,7 @@ struct InitOriginParams PersistenceType persistenceType; }; -struct UsageParams +struct OriginUsageParams { PrincipalInfo principalInfo; bool getGroupUsage; @@ -35,7 +35,7 @@ struct UsageParams union UsageRequestParams { - UsageParams; + OriginUsageParams; }; struct ClearOriginParams diff --git a/dom/quota/PQuotaUsageRequest.ipdl b/dom/quota/PQuotaUsageRequest.ipdl index fbf7941c15d19..682222204fa28 100644 --- a/dom/quota/PQuotaUsageRequest.ipdl +++ b/dom/quota/PQuotaUsageRequest.ipdl @@ -8,7 +8,7 @@ namespace mozilla { namespace dom { namespace quota { -struct UsageResponse +struct OriginUsageResponse { uint64_t usage; uint64_t fileUsage; @@ -18,7 +18,7 @@ struct UsageResponse union UsageRequestResponse { nsresult; - UsageResponse; + OriginUsageResponse; }; protocol PQuotaUsageRequest diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp index 659d87a9e102b..9d495591ff0d3 100644 --- a/dom/quota/QuotaManagerService.cpp +++ b/dom/quota/QuotaManagerService.cpp @@ -596,7 +596,7 @@ QuotaManagerService::GetUsageForPrincipal(nsIPrincipal* aPrincipal, RefPtr request = new UsageRequest(aPrincipal, aCallback); - UsageParams params; + OriginUsageParams params; nsresult rv = CheckedPrincipalToPrincipalInfo(aPrincipal, params.principalInfo()); diff --git a/dom/quota/QuotaResults.cpp b/dom/quota/QuotaResults.cpp index 55a1dd9332dc4..be02691579e0b 100644 --- a/dom/quota/QuotaResults.cpp +++ b/dom/quota/QuotaResults.cpp @@ -10,20 +10,20 @@ namespace mozilla { namespace dom { namespace quota { -UsageResult::UsageResult(uint64_t aUsage, - uint64_t aFileUsage, - uint64_t aLimit) +OriginUsageResult::OriginUsageResult(uint64_t aUsage, + uint64_t aFileUsage, + uint64_t aLimit) : mUsage(aUsage) , mFileUsage(aFileUsage) , mLimit(aLimit) { } -NS_IMPL_ISUPPORTS(UsageResult, - nsIQuotaUsageResult) +NS_IMPL_ISUPPORTS(OriginUsageResult, + nsIQuotaOriginUsageResult) NS_IMETHODIMP -UsageResult::GetUsage(uint64_t* aUsage) +OriginUsageResult::GetUsage(uint64_t* aUsage) { MOZ_ASSERT(aUsage); @@ -32,7 +32,7 @@ UsageResult::GetUsage(uint64_t* aUsage) } NS_IMETHODIMP -UsageResult::GetFileUsage(uint64_t* aFileUsage) +OriginUsageResult::GetFileUsage(uint64_t* aFileUsage) { MOZ_ASSERT(aFileUsage); @@ -41,7 +41,7 @@ UsageResult::GetFileUsage(uint64_t* aFileUsage) } NS_IMETHODIMP -UsageResult::GetLimit(uint64_t* aLimit) +OriginUsageResult::GetLimit(uint64_t* aLimit) { MOZ_ASSERT(aLimit); diff --git a/dom/quota/QuotaResults.h b/dom/quota/QuotaResults.h index d32e245faa574..4d38d6d8d5788 100644 --- a/dom/quota/QuotaResults.h +++ b/dom/quota/QuotaResults.h @@ -13,24 +13,24 @@ namespace mozilla { namespace dom { namespace quota { -class UsageResult - : public nsIQuotaUsageResult +class OriginUsageResult + : public nsIQuotaOriginUsageResult { uint64_t mUsage; uint64_t mFileUsage; uint64_t mLimit; public: - UsageResult(uint64_t aUsage, - uint64_t aFileUsage, - uint64_t aLimit); + OriginUsageResult(uint64_t aUsage, + uint64_t aFileUsage, + uint64_t aLimit); private: - virtual ~UsageResult() + virtual ~OriginUsageResult() { } NS_DECL_ISUPPORTS - NS_DECL_NSIQUOTAUSAGERESULT + NS_DECL_NSIQUOTAORIGINUSAGERESULT }; } // namespace quota diff --git a/dom/quota/StorageManager.cpp b/dom/quota/StorageManager.cpp index 1a4773825b660..4e9f0cf8c6b2e 100644 --- a/dom/quota/StorageManager.cpp +++ b/dom/quota/StorageManager.cpp @@ -148,14 +148,15 @@ GetStorageEstimate(nsIQuotaUsageRequest* aRequest, free(iid); - nsCOMPtr usageResult = do_QueryInterface(supports); - MOZ_ASSERT(usageResult); + nsCOMPtr originUsageResult = + do_QueryInterface(supports); + MOZ_ASSERT(originUsageResult); MOZ_ALWAYS_SUCCEEDS( - usageResult->GetUsage(&aStorageEstimate.mUsage.Construct())); + originUsageResult->GetUsage(&aStorageEstimate.mUsage.Construct())); MOZ_ALWAYS_SUCCEEDS( - usageResult->GetLimit(&aStorageEstimate.mQuota.Construct())); + originUsageResult->GetLimit(&aStorageEstimate.mQuota.Construct())); return NS_OK; } diff --git a/dom/quota/nsIQuotaRequests.idl b/dom/quota/nsIQuotaRequests.idl index c8d39c3ed2a0a..e30a6ebbbfbba 100644 --- a/dom/quota/nsIQuotaRequests.idl +++ b/dom/quota/nsIQuotaRequests.idl @@ -23,7 +23,7 @@ interface nsIQuotaRequestBase : nsISupports interface nsIQuotaUsageRequest : nsIQuotaRequestBase { // The result can contain one of these types: - // nsIQuotaUsageResult + // nsIQuotaOriginUsageResult [must_use] readonly attribute nsIVariant result; attribute nsIQuotaUsageCallback callback; diff --git a/dom/quota/nsIQuotaResults.idl b/dom/quota/nsIQuotaResults.idl index e8d05a20e6406..1c787009dcd07 100644 --- a/dom/quota/nsIQuotaResults.idl +++ b/dom/quota/nsIQuotaResults.idl @@ -7,7 +7,7 @@ #include "nsISupports.idl" [scriptable, function, uuid(96df03d2-116a-493f-bb0b-118c212a6b32)] -interface nsIQuotaUsageResult : nsISupports +interface nsIQuotaOriginUsageResult : nsISupports { readonly attribute unsigned long long usage; diff --git a/dom/quota/test/unit/head.js b/dom/quota/test/unit/head.js index 879c2cb7fc1f0..89df227644c10 100644 --- a/dom/quota/test/unit/head.js +++ b/dom/quota/test/unit/head.js @@ -266,7 +266,7 @@ function grabUsageAndContinueHandler(request) testGenerator.next(request.result.usage); } -function getUsage(usageHandler) +function getCurrentUsage(usageHandler) { let principal = Cc["@mozilla.org/systemprincipal;1"] .createInstance(Ci.nsIPrincipal); diff --git a/dom/quota/test/unit/test_basics.js b/dom/quota/test/unit/test_basics.js index f23898c45abce..29aadf1fe11cb 100644 --- a/dom/quota/test/unit/test_basics.js +++ b/dom/quota/test/unit/test_basics.js @@ -38,7 +38,7 @@ function* testSteps() info("Getting usage"); - getUsage(grabUsageAndContinueHandler); + getCurrentUsage(grabUsageAndContinueHandler); let usage = yield undefined; ok(usage == 0, "Usage is zero"); @@ -53,7 +53,7 @@ function* testSteps() info("Getting usage"); - getUsage(grabUsageAndContinueHandler); + getCurrentUsage(grabUsageAndContinueHandler); usage = yield undefined; ok(usage > 0, "Usage is not zero"); diff --git a/dom/quota/test/unit/test_unknownFiles.js b/dom/quota/test/unit/test_unknownFiles.js index 8eef05b830249..e14af9695cdf5 100644 --- a/dom/quota/test/unit/test_unknownFiles.js +++ b/dom/quota/test/unit/test_unknownFiles.js @@ -131,7 +131,7 @@ function* testSteps() info("Getting usage"); - request = getUsage(continueToNextStepSync); + request = getCurrentUsage(continueToNextStepSync); yield undefined; ok(request.resultCode == NS_ERROR_UNEXPECTED, "Get usage failed"); @@ -140,7 +140,7 @@ function* testSteps() info("Getting usage"); - request = getUsage(continueToNextStepSync); + request = getCurrentUsage(continueToNextStepSync); yield undefined; ok(request.resultCode == NS_OK, "Get usage succeeded"); @@ -156,7 +156,7 @@ function* testSteps() info("Getting usage"); - request = getUsage(continueToNextStepSync); + request = getCurrentUsage(continueToNextStepSync); yield undefined; ok(request.resultCode == NS_OK, "Get usage succeeded"); From a645da543d789e948687aacf732d8e3adb53cd63 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:13:54 +0100 Subject: [PATCH 239/300] Bug 1348660 - Part 3: Separate the canceled state out of UsageInfo; r=btseng --- dom/asmjscache/AsmJSCache.cpp | 10 ++++++++-- dom/cache/QuotaClient.cpp | 20 ++++++++++++-------- dom/indexedDB/ActorsParent.cpp | 30 ++++++++++++++++++++---------- dom/quota/ActorsParent.cpp | 19 +++++++++++++------ dom/quota/Client.h | 4 ++++ dom/quota/UsageInfo.h | 23 +++-------------------- 6 files changed, 60 insertions(+), 46 deletions(-) diff --git a/dom/asmjscache/AsmJSCache.cpp b/dom/asmjscache/AsmJSCache.cpp index 3c2c959ca8f5d..e8f657bff0cf1 100644 --- a/dom/asmjscache/AsmJSCache.cpp +++ b/dom/asmjscache/AsmJSCache.cpp @@ -1623,18 +1623,24 @@ class Client : public quota::Client InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override { if (!aUsageInfo) { return NS_OK; } - return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aUsageInfo); + return GetUsageForOrigin(aPersistenceType, + aGroup, + aOrigin, + aCanceled, + aUsageInfo); } nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override { QuotaManager* qm = QuotaManager::Get(); @@ -1658,7 +1664,7 @@ class Client : public quota::Client bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && - hasMore && !aUsageInfo->Canceled()) { + hasMore && !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/cache/QuotaClient.cpp b/dom/cache/QuotaClient.cpp index b33fa8c34a318..5641c953c6c03 100644 --- a/dom/cache/QuotaClient.cpp +++ b/dom/cache/QuotaClient.cpp @@ -16,6 +16,7 @@ namespace { +using mozilla::Atomic; using mozilla::dom::ContentParentId; using mozilla::dom::cache::Manager; using mozilla::dom::quota::Client; @@ -25,7 +26,8 @@ using mozilla::dom::quota::UsageInfo; using mozilla::ipc::AssertIsOnBackgroundThread; static nsresult -GetBodyUsage(nsIFile* aDir, UsageInfo* aUsageInfo) +GetBodyUsage(nsIFile* aDir, const Atomic& aCanceled, + UsageInfo* aUsageInfo) { nsCOMPtr entries; nsresult rv = aDir->GetDirectoryEntries(getter_AddRefs(entries)); @@ -33,7 +35,7 @@ GetBodyUsage(nsIFile* aDir, UsageInfo* aUsageInfo) bool hasMore; while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore && - !aUsageInfo->Canceled()) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -45,7 +47,7 @@ GetBodyUsage(nsIFile* aDir, UsageInfo* aUsageInfo) if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } if (isDir) { - rv = GetBodyUsage(file, aUsageInfo); + rv = GetBodyUsage(file, aCanceled, aUsageInfo); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } continue; } @@ -72,7 +74,8 @@ class CacheQuotaClient final : public Client virtual nsresult InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, - const nsACString& aOrigin, UsageInfo* aUsageInfo) override + const nsACString& aOrigin, const AtomicBool& aCanceled, + UsageInfo* aUsageInfo) override { // The QuotaManager passes a nullptr UsageInfo if there is no quota being // enforced against the origin. @@ -80,12 +83,13 @@ class CacheQuotaClient final : public Client return NS_OK; } - return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aUsageInfo); + return GetUsageForOrigin(aPersistenceType, aGroup, aOrigin, aCanceled, + aUsageInfo); } virtual nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, - const nsACString& aOrigin, + const nsACString& aOrigin, const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override { MOZ_DIAGNOSTIC_ASSERT(aUsageInfo); @@ -107,7 +111,7 @@ class CacheQuotaClient final : public Client bool hasMore; while (NS_SUCCEEDED(rv = entries->HasMoreElements(&hasMore)) && hasMore && - !aUsageInfo->Canceled()) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -124,7 +128,7 @@ class CacheQuotaClient final : public Client if (isDir) { if (leafName.EqualsLiteral("morgue")) { - rv = GetBodyUsage(file, aUsageInfo); + rv = GetBodyUsage(file, aCanceled, aUsageInfo); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } } else { NS_WARNING("Unknown Cache directory found!"); diff --git a/dom/indexedDB/ActorsParent.cpp b/dom/indexedDB/ActorsParent.cpp index d30f58e8d4563..feaabc9d49f9f 100644 --- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -9347,12 +9347,14 @@ class QuotaClient final InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override; nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) override; void @@ -9394,13 +9396,14 @@ class QuotaClient final nsresult GetDatabaseFilenames(nsIFile* aDirectory, - UsageInfo* aUsageInfo, + const AtomicBool& aCanceled, bool aForUpgrade, nsTArray& aSubdirsToProcess, nsTHashtable& aDatabaseFilename); nsresult GetUsageForDirectoryInternal(nsIFile* aDirectory, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo, bool aDatabaseFiles); @@ -17828,10 +17831,11 @@ QuotaClient::UpgradeStorageFrom1_0To2_0(nsIFile* aDirectory) AssertIsOnIOThread(); MOZ_ASSERT(aDirectory); + AtomicBool dummy(false); AutoTArray subdirsToProcess; nsTHashtable databaseFilenames(20); nsresult rv = GetDatabaseFilenames(aDirectory, - nullptr, + /* aCanceled */ dummy, /* aForUpgrade */ true, subdirsToProcess, databaseFilenames); @@ -17924,6 +17928,7 @@ nsresult QuotaClient::InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) { AssertIsOnIOThread(); @@ -17942,7 +17947,7 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType, AutoTArray subdirsToProcess; nsTHashtable databaseFilenames(20); rv = GetDatabaseFilenames(directory, - aUsageInfo, + aCanceled, /* aForUpgrade */ false, subdirsToProcess, databaseFilenames); @@ -17974,7 +17979,9 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType, const NS_ConvertASCIItoUTF16 walSuffix(kSQLiteWALSuffix, LiteralStringLength(kSQLiteWALSuffix)); - for (auto iter = databaseFilenames.ConstIter(); !iter.Done(); iter.Next()) { + for (auto iter = databaseFilenames.ConstIter(); + !iter.Done() && !aCanceled; + iter.Next()) { auto& databaseFilename = iter.Get()->GetKey(); nsCOMPtr fmDirectory; @@ -18022,7 +18029,7 @@ QuotaClient::InitOrigin(PersistenceType aPersistenceType, return rv; } - if (aUsageInfo && !aUsageInfo->Canceled()) { + if (aUsageInfo) { int64_t fileSize; rv = databaseFile->GetFileSize(&fileSize); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -18059,6 +18066,7 @@ nsresult QuotaClient::GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) { AssertIsOnIOThread(); @@ -18071,7 +18079,7 @@ QuotaClient::GetUsageForOrigin(PersistenceType aPersistenceType, return rv; } - rv = GetUsageForDirectoryInternal(directory, aUsageInfo, true); + rv = GetUsageForDirectoryInternal(directory, aCanceled, aUsageInfo, true); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -18260,12 +18268,13 @@ QuotaClient::GetDirectory(PersistenceType aPersistenceType, nsresult QuotaClient::GetDatabaseFilenames( nsIFile* aDirectory, - UsageInfo* aUsageInfo, + const AtomicBool& aCanceled, bool aForUpgrade, nsTArray& aSubdirsToProcess, nsTHashtable& aDatabaseFilenames) { AssertIsOnIOThread(); + MOZ_ASSERT(aDirectory); nsCOMPtr entries; nsresult rv = aDirectory->GetDirectoryEntries(getter_AddRefs(entries)); @@ -18286,7 +18295,7 @@ QuotaClient::GetDatabaseFilenames( bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore && - (!aUsageInfo || !aUsageInfo->Canceled())) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -18362,6 +18371,7 @@ QuotaClient::GetDatabaseFilenames( nsresult QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo, bool aDatabaseFiles) { @@ -18388,7 +18398,7 @@ QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory, bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && hasMore && - !aUsageInfo->Canceled()) { + !aCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); if (NS_WARN_IF(NS_FAILED(rv))) { @@ -18423,7 +18433,7 @@ QuotaClient::GetUsageForDirectoryInternal(nsIFile* aDirectory, if (isDirectory) { if (aDatabaseFiles) { - rv = GetUsageForDirectoryInternal(file, aUsageInfo, false); + rv = GetUsageForDirectoryInternal(file, aCanceled, aUsageInfo, false); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index 68459c1d0a3d5..9a7223c33bebf 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -915,6 +915,7 @@ class NormalOriginOperationBase protected: Nullable mPersistenceType; OriginScope mOriginScope; + mozilla::Atomic mCanceled; const bool mExclusive; public: @@ -4196,7 +4197,11 @@ QuotaManager::InitializeOrigin(PersistenceType aPersistenceType, return NS_ERROR_UNEXPECTED; } - rv = mClients[clientType]->InitOrigin(aPersistenceType, aGroup, aOrigin, + Atomic dummy(false); + rv = mClients[clientType]->InitOrigin(aPersistenceType, + aGroup, + aOrigin, + /* aCanceled */ dummy, usageInfo); NS_ENSURE_SUCCESS(rv, rv); } @@ -6484,7 +6489,7 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, // If the directory exists then enumerate all the files inside, adding up // the sizes to get the final usage statistic. - if (exists && !mUsageInfo.Canceled()) { + if (exists && !mCanceled) { bool initialized; if (aPersistenceType == PERSISTENCE_TYPE_PERSISTENT) { @@ -6500,7 +6505,7 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, bool hasMore; while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && - hasMore && !mUsageInfo.Canceled()) { + hasMore && !mCanceled) { nsCOMPtr entry; rv = entries->GetNext(getter_AddRefs(entry)); NS_ENSURE_SUCCESS(rv, rv); @@ -6564,12 +6569,14 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, rv = client->GetUsageForOrigin(aPersistenceType, mGroup, mOriginScope.GetOrigin(), + mCanceled, &mUsageInfo); } else { rv = client->InitOrigin(aPersistenceType, mGroup, mOriginScope.GetOrigin(), + mCanceled, &mUsageInfo); } NS_ENSURE_SUCCESS(rv, rv); @@ -6630,7 +6637,7 @@ GetOriginUsageOp::SendResults() mResultCode = NS_ERROR_FAILURE; } } else { - if (mUsageInfo.Canceled()) { + if (mCanceled) { mResultCode = NS_ERROR_FAILURE; } @@ -6671,8 +6678,8 @@ GetOriginUsageOp::RecvCancel() { AssertIsOnOwningThread(); - nsresult rv = mUsageInfo.Cancel(); - if (NS_WARN_IF(NS_FAILED(rv))) { + if (mCanceled.exchange(true)) { + NS_WARNING("Canceled more than once?!"); return IPC_FAIL_NO_REASON(this); } diff --git a/dom/quota/Client.h b/dom/quota/Client.h index b70d3e606914c..4ee5ed228646c 100644 --- a/dom/quota/Client.h +++ b/dom/quota/Client.h @@ -31,6 +31,8 @@ class UsageInfo; class Client { public: + typedef mozilla::Atomic AtomicBool; + NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING enum Type { @@ -100,12 +102,14 @@ class Client InitOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) = 0; virtual nsresult GetUsageForOrigin(PersistenceType aPersistenceType, const nsACString& aGroup, const nsACString& aOrigin, + const AtomicBool& aCanceled, UsageInfo* aUsageInfo) = 0; virtual void diff --git a/dom/quota/UsageInfo.h b/dom/quota/UsageInfo.h index 688e168707fa8..67b73195b54a8 100644 --- a/dom/quota/UsageInfo.h +++ b/dom/quota/UsageInfo.h @@ -18,28 +18,14 @@ class UsageInfo { public: UsageInfo() - : mCanceled(false), mDatabaseUsage(0), mFileUsage(0), mLimit(0) + : mDatabaseUsage(0) + , mFileUsage(0) + , mLimit(0) { } virtual ~UsageInfo() { } - bool - Canceled() - { - return mCanceled; - } - - nsresult - Cancel() - { - if (mCanceled.exchange(true)) { - NS_WARNING("Canceled more than once?!"); - return NS_ERROR_UNEXPECTED; - } - return NS_OK; - } - void AppendToDatabaseUsage(uint64_t aUsage) { @@ -104,9 +90,6 @@ class UsageInfo } } -protected: - mozilla::Atomic mCanceled; - private: uint64_t mDatabaseUsage; uint64_t mFileUsage; From 813cdbdbcb0c97a242245ebf3b863855429d2117 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:13:58 +0100 Subject: [PATCH 240/300] Bug 1348660 - Part 4: Extract common code from GetOriginUsageOp to a new base class QuotaUsageRequestBase; r=btseng --- dom/quota/ActorsParent.cpp | 318 +++++++++++++++++++++++-------------- dom/quota/UsageInfo.h | 7 + 2 files changed, 203 insertions(+), 122 deletions(-) diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index 9a7223c33bebf..46f59713121d0 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -1043,9 +1043,48 @@ class Quota final RecvStopIdleMaintenance() override; }; -class GetOriginUsageOp final +class QuotaUsageRequestBase : public NormalOriginOperationBase , public PQuotaUsageRequestParent +{ +public: + // May be overridden by subclasses if they need to perform work on the + // background thread before being run. + virtual bool + Init(Quota* aQuota); + +protected: + QuotaUsageRequestBase() + : NormalOriginOperationBase(Nullable(), + OriginScope::FromNull(), + /* aExclusive */ false) + { } + + nsresult + GetUsageForOrigin(QuotaManager* aQuotaManager, + PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aOrigin, + UsageInfo* aUsageInfo); + + // Subclasses use this override to set the IPDL response value. + virtual void + GetResponse(UsageRequestResponse& aResponse) = 0; + +private: + void + SendResults() override; + + // IPDL methods. + void + ActorDestroy(ActorDestroyReason aWhy) override; + + mozilla::ipc::IPCResult + RecvCancel() override; +}; + +class GetOriginUsageOp final + : public QuotaUsageRequestBase { // If mGetGroupUsage is false, we use mUsageInfo to record the origin usage // and the file usage. Otherwise, we use it to record the group usage and the @@ -1061,7 +1100,7 @@ class GetOriginUsageOp final explicit GetOriginUsageOp(const UsageRequestParams& aParams); MOZ_IS_CLASS_INIT bool - Init(Quota* aQuota); + Init(Quota* aQuota) override; private: ~GetOriginUsageOp() @@ -1070,22 +1109,11 @@ class GetOriginUsageOp final MOZ_IS_CLASS_INIT virtual nsresult DoInitOnMainThread() override; - nsresult - AddToUsage(QuotaManager* aQuotaManager, - PersistenceType aPersistenceType); - virtual nsresult DoDirectoryWork(QuotaManager* aQuotaManager) override; - virtual void - SendResults() override; - - // IPDL methods. - virtual void - ActorDestroy(ActorDestroyReason aWhy) override; - - virtual mozilla::ipc::IPCResult - RecvCancel() override; + void + GetResponse(UsageRequestResponse& aResponse) override; }; class QuotaRequestBase @@ -6235,7 +6263,21 @@ Quota::ActorDestroy(ActorDestroyReason aWhy) PQuotaUsageRequestParent* Quota::AllocPQuotaUsageRequestParent(const UsageRequestParams& aParams) { - RefPtr actor = new GetOriginUsageOp(aParams); + AssertIsOnBackgroundThread(); + MOZ_ASSERT(aParams.type() != UsageRequestParams::T__None); + + RefPtr actor; + + switch (aParams.type()) { + case UsageRequestParams::TOriginUsageParams: + actor = new GetOriginUsageOp(aParams); + break; + + default: + MOZ_CRASH("Should never get here!"); + } + + MOZ_ASSERT(actor); // Transfer ownership to IPDL. return actor.forget().take(); @@ -6249,7 +6291,7 @@ Quota::RecvPQuotaUsageRequestConstructor(PQuotaUsageRequestParent* aActor, MOZ_ASSERT(aActor); MOZ_ASSERT(aParams.type() != UsageRequestParams::T__None); - auto* op = static_cast(aActor); + auto* op = static_cast(aActor); if (NS_WARN_IF(!op->Init(this))) { return IPC_FAIL_NO_REASON(this); @@ -6266,8 +6308,8 @@ Quota::DeallocPQuotaUsageRequestParent(PQuotaUsageRequestParent* aActor) MOZ_ASSERT(aActor); // Transfer ownership back from IPDL. - RefPtr actor = - dont_AddRef(static_cast(aActor)); + RefPtr actor = + dont_AddRef(static_cast(aActor)); return true; } @@ -6341,6 +6383,7 @@ Quota::RecvPQuotaRequestConstructor(PQuotaRequestParent* aActor, MOZ_ASSERT(aParams.type() != RequestParams::T__None); auto* op = static_cast(aActor); + if (NS_WARN_IF(!op->Init(this))) { return IPC_FAIL_NO_REASON(this); } @@ -6419,67 +6462,32 @@ Quota::RecvStopIdleMaintenance() return IPC_OK(); } -GetOriginUsageOp::GetOriginUsageOp(const UsageRequestParams& aParams) - : NormalOriginOperationBase(Nullable(), - OriginScope::FromNull(), - /* aExclusive */ false) - , mParams(aParams.get_OriginUsageParams()) - , mGetGroupUsage(aParams.get_OriginUsageParams().getGroupUsage()) -{ - AssertIsOnOwningThread(); - MOZ_ASSERT(aParams.type() == UsageRequestParams::TOriginUsageParams); -} - bool -GetOriginUsageOp::Init(Quota* aQuota) +QuotaUsageRequestBase::Init(Quota* aQuota) { AssertIsOnOwningThread(); MOZ_ASSERT(aQuota); - mNeedsMainThreadInit = true; mNeedsQuotaManagerInit = true; return true; } nsresult -GetOriginUsageOp::DoInitOnMainThread() -{ - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(GetState() == State_Initializing); - MOZ_ASSERT(mNeedsMainThreadInit); - - const PrincipalInfo& principalInfo = mParams.principalInfo(); - - nsresult rv; - nsCOMPtr principal = - PrincipalInfoToPrincipal(principalInfo, &rv); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - // Figure out which origin we're dealing with. - nsCString origin; - rv = QuotaManager::GetInfoFromPrincipal(principal, &mSuffix, &mGroup, - &origin); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - mOriginScope.SetFromOrigin(origin); - - return NS_OK; -} - -nsresult -GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, - PersistenceType aPersistenceType) +QuotaUsageRequestBase::GetUsageForOrigin(QuotaManager* aQuotaManager, + PersistenceType aPersistenceType, + const nsACString& aGroup, + const nsACString& aOrigin, + UsageInfo* aUsageInfo) { AssertIsOnIOThread(); + MOZ_ASSERT(aQuotaManager); + MOZ_ASSERT(aUsageInfo); + MOZ_ASSERT(aUsageInfo->TotalUsage() == 0); nsCOMPtr directory; nsresult rv = aQuotaManager->GetDirectoryForOrigin(aPersistenceType, - mOriginScope.GetOrigin(), + aOrigin, getter_AddRefs(directory)); NS_ENSURE_SUCCESS(rv, rv); @@ -6493,8 +6501,7 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, bool initialized; if (aPersistenceType == PERSISTENCE_TYPE_PERSISTENT) { - initialized = - aQuotaManager->IsOriginInitialized(mOriginScope.GetOrigin()); + initialized = aQuotaManager->IsOriginInitialized(aOrigin); } else { initialized = aQuotaManager->IsTemporaryStorageInitialized(); } @@ -6567,17 +6574,17 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, if (initialized) { rv = client->GetUsageForOrigin(aPersistenceType, - mGroup, - mOriginScope.GetOrigin(), + aGroup, + aOrigin, mCanceled, - &mUsageInfo); + aUsageInfo); } else { rv = client->InitOrigin(aPersistenceType, - mGroup, - mOriginScope.GetOrigin(), + aGroup, + aOrigin, mCanceled, - &mUsageInfo); + aUsageInfo); } NS_ENSURE_SUCCESS(rv, rv); } @@ -6586,6 +6593,105 @@ GetOriginUsageOp::AddToUsage(QuotaManager* aQuotaManager, return NS_OK; } +void +QuotaUsageRequestBase::SendResults() +{ + AssertIsOnOwningThread(); + + if (IsActorDestroyed()) { + if (NS_SUCCEEDED(mResultCode)) { + mResultCode = NS_ERROR_FAILURE; + } + } else { + if (mCanceled) { + mResultCode = NS_ERROR_FAILURE; + } + + UsageRequestResponse response; + + if (NS_SUCCEEDED(mResultCode)) { + GetResponse(response); + } else { + response = mResultCode; + } + + Unused << PQuotaUsageRequestParent::Send__delete__(this, response); + } +} + +void +QuotaUsageRequestBase::ActorDestroy(ActorDestroyReason aWhy) +{ + AssertIsOnOwningThread(); + + NoteActorDestroyed(); +} + +mozilla::ipc::IPCResult +QuotaUsageRequestBase::RecvCancel() +{ + AssertIsOnOwningThread(); + + if (mCanceled.exchange(true)) { + NS_WARNING("Canceled more than once?!"); + return IPC_FAIL_NO_REASON(this); + } + + return IPC_OK(); +} + +GetOriginUsageOp::GetOriginUsageOp(const UsageRequestParams& aParams) + : mParams(aParams.get_OriginUsageParams()) + , mGetGroupUsage(aParams.get_OriginUsageParams().getGroupUsage()) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aParams.type() == UsageRequestParams::TOriginUsageParams); +} + +bool +GetOriginUsageOp::Init(Quota* aQuota) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aQuota); + + if (NS_WARN_IF(!QuotaUsageRequestBase::Init(aQuota))) { + return false; + } + + mNeedsMainThreadInit = true; + + return true; +} + +nsresult +GetOriginUsageOp::DoInitOnMainThread() +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(GetState() == State_Initializing); + MOZ_ASSERT(mNeedsMainThreadInit); + + const PrincipalInfo& principalInfo = mParams.principalInfo(); + + nsresult rv; + nsCOMPtr principal = + PrincipalInfoToPrincipal(principalInfo, &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + // Figure out which origin we're dealing with. + nsCString origin; + rv = QuotaManager::GetInfoFromPrincipal(principal, &mSuffix, &mGroup, + &origin); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + mOriginScope.SetFromOrigin(origin); + + return NS_OK; +} + nsresult GetOriginUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) { @@ -6618,72 +6724,40 @@ GetOriginUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) // Add all the persistent/temporary/default storage files we care about. for (const PersistenceType type : kAllPersistenceTypes) { - rv = AddToUsage(aQuotaManager, type); + UsageInfo usageInfo; + rv = GetUsageForOrigin(aQuotaManager, + type, + mGroup, + mOriginScope.GetOrigin(), + &usageInfo); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } + + mUsageInfo.Append(usageInfo); } return NS_OK; } void -GetOriginUsageOp::SendResults() +GetOriginUsageOp::GetResponse(UsageRequestResponse& aResponse) { AssertIsOnOwningThread(); - if (IsActorDestroyed()) { - if (NS_SUCCEEDED(mResultCode)) { - mResultCode = NS_ERROR_FAILURE; - } - } else { - if (mCanceled) { - mResultCode = NS_ERROR_FAILURE; - } + OriginUsageResponse usageResponse; - UsageRequestResponse response; - - if (NS_SUCCEEDED(mResultCode)) { - OriginUsageResponse usageResponse; + // We'll get the group usage when mGetGroupUsage is true and get the + // origin usage when mGetGroupUsage is false. + usageResponse.usage() = mUsageInfo.TotalUsage(); - // We'll get the group usage when mGetGroupUsage is true and get the - // origin usage when mGetGroupUsage is false. - usageResponse.usage() = mUsageInfo.TotalUsage(); - - if (mGetGroupUsage) { - usageResponse.limit() = mUsageInfo.Limit(); - } else { - usageResponse.fileUsage() = mUsageInfo.FileUsage(); - } - - response = usageResponse; - } else { - response = mResultCode; - } - - Unused << PQuotaUsageRequestParent::Send__delete__(this, response); - } -} - -void -GetOriginUsageOp::ActorDestroy(ActorDestroyReason aWhy) -{ - AssertIsOnOwningThread(); - - NoteActorDestroyed(); -} - -mozilla::ipc::IPCResult -GetOriginUsageOp::RecvCancel() -{ - AssertIsOnOwningThread(); - - if (mCanceled.exchange(true)) { - NS_WARNING("Canceled more than once?!"); - return IPC_FAIL_NO_REASON(this); + if (mGetGroupUsage) { + usageResponse.limit() = mUsageInfo.Limit(); + } else { + usageResponse.fileUsage() = mUsageInfo.FileUsage(); } - return IPC_OK(); + aResponse = usageResponse; } bool diff --git a/dom/quota/UsageInfo.h b/dom/quota/UsageInfo.h index 67b73195b54a8..9d34f1bff61ea 100644 --- a/dom/quota/UsageInfo.h +++ b/dom/quota/UsageInfo.h @@ -26,6 +26,13 @@ class UsageInfo virtual ~UsageInfo() { } + void + Append(const UsageInfo& aUsageInfo) + { + IncrementUsage(&mDatabaseUsage, aUsageInfo.mDatabaseUsage); + IncrementUsage(&mFileUsage, aUsageInfo.mFileUsage); + } + void AppendToDatabaseUsage(uint64_t aUsage) { From 14db48c112fe3d18f854e7199cd06c16fb5d225b Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:14:04 +0100 Subject: [PATCH 241/300] Bug 1348660 - Part 5: Implement a method to retrieve usage data for all origins at once; r=btseng --- dom/quota/ActorsChild.cpp | 40 +++++ dom/quota/ActorsChild.h | 3 + dom/quota/ActorsParent.cpp | 205 +++++++++++++++++++++++ dom/quota/PQuota.ipdl | 6 + dom/quota/PQuotaUsageRequest.ipdl | 13 ++ dom/quota/QuotaManagerService.cpp | 25 +++ dom/quota/QuotaRequests.cpp | 9 + dom/quota/QuotaRequests.h | 2 + dom/quota/QuotaResults.cpp | 37 ++++ dom/quota/QuotaResults.h | 20 +++ dom/quota/nsIQuotaManagerService.idl | 15 ++ dom/quota/nsIQuotaRequests.idl | 1 + dom/quota/nsIQuotaResults.idl | 10 ++ dom/quota/test/unit/getUsage_profile.zip | Bin 0 -> 24717 bytes dom/quota/test/unit/head.js | 12 ++ dom/quota/test/unit/test_getUsage.js | 127 ++++++++++++++ dom/quota/test/unit/xpcshell.ini | 2 + 17 files changed, 527 insertions(+) create mode 100644 dom/quota/test/unit/getUsage_profile.zip create mode 100644 dom/quota/test/unit/test_getUsage.js diff --git a/dom/quota/ActorsChild.cpp b/dom/quota/ActorsChild.cpp index ffb35104a8574..364896c546954 100644 --- a/dom/quota/ActorsChild.cpp +++ b/dom/quota/ActorsChild.cpp @@ -141,6 +141,42 @@ QuotaUsageRequestChild::HandleResponse(nsresult aResponse) mRequest->SetError(aResponse); } +void +QuotaUsageRequestChild::HandleResponse(const nsTArray& aResponse) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(mRequest); + + RefPtr variant = new nsVariant(); + + if (aResponse.IsEmpty()) { + variant->SetAsEmptyArray(); + } else { + nsTArray> usageResults; + + const uint32_t count = aResponse.Length(); + + usageResults.SetCapacity(count); + + for (uint32_t index = 0; index < count; index++) { + auto& originUsage = aResponse[index]; + + RefPtr usageResult = new UsageResult(originUsage.origin(), + originUsage.persisted(), + originUsage.usage()); + + usageResults.AppendElement(usageResult.forget()); + } + + variant->SetAsArray(nsIDataType::VTYPE_INTERFACE_IS, + &NS_GET_IID(nsIQuotaUsageResult), + usageResults.Length(), + static_cast(usageResults.Elements())); + } + + mRequest->SetResult(variant); +} + void QuotaUsageRequestChild::HandleResponse(const OriginUsageResponse& aResponse) { @@ -182,6 +218,10 @@ QuotaUsageRequestChild::Recv__delete__(const UsageRequestResponse& aResponse) HandleResponse(aResponse.get_nsresult()); break; + case UsageRequestResponse::TAllUsageResponse: + HandleResponse(aResponse.get_AllUsageResponse().originUsages()); + break; + case UsageRequestResponse::TOriginUsageResponse: HandleResponse(aResponse.get_OriginUsageResponse()); break; diff --git a/dom/quota/ActorsChild.h b/dom/quota/ActorsChild.h index 4bc5e85a5f29f..fe1abf1094d04 100644 --- a/dom/quota/ActorsChild.h +++ b/dom/quota/ActorsChild.h @@ -97,6 +97,9 @@ class QuotaUsageRequestChild final void HandleResponse(nsresult aResponse); + void + HandleResponse(const nsTArray& aResponse); + void HandleResponse(const OriginUsageResponse& aResponse); diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index 46f59713121d0..b503738c0ae36 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -1083,6 +1083,32 @@ class QuotaUsageRequestBase RecvCancel() override; }; +class GetUsageOp final + : public QuotaUsageRequestBase +{ + nsTArray mOriginUsages; + nsDataHashtable mOriginUsagesIndex; + + bool mGetAll; + +public: + explicit GetUsageOp(const UsageRequestParams& aParams); + +private: + ~GetUsageOp() + { } + + nsresult + TraverseRepository(QuotaManager* aQuotaManager, + PersistenceType aPersistenceType); + + nsresult + DoDirectoryWork(QuotaManager* aQuotaManager) override; + + void + GetResponse(UsageRequestResponse& aResponse) override; +}; + class GetOriginUsageOp final : public QuotaUsageRequestBase { @@ -6269,6 +6295,10 @@ Quota::AllocPQuotaUsageRequestParent(const UsageRequestParams& aParams) RefPtr actor; switch (aParams.type()) { + case UsageRequestParams::TAllUsageParams: + actor = new GetUsageOp(aParams); + break; + case UsageRequestParams::TOriginUsageParams: actor = new GetOriginUsageOp(aParams); break; @@ -6640,6 +6670,181 @@ QuotaUsageRequestBase::RecvCancel() return IPC_OK(); } +GetUsageOp::GetUsageOp(const UsageRequestParams& aParams) + : mGetAll(aParams.get_AllUsageParams().getAll()) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aParams.type() == UsageRequestParams::TAllUsageParams); +} + +nsresult +GetUsageOp::TraverseRepository(QuotaManager* aQuotaManager, + PersistenceType aPersistenceType) +{ + AssertIsOnIOThread(); + MOZ_ASSERT(aQuotaManager); + + nsresult rv; + + nsCOMPtr directory = + do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + rv = directory->InitWithPath(aQuotaManager->GetStoragePath(aPersistenceType)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + bool exists; + rv = directory->Exists(&exists); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!exists) { + return NS_OK; + } + + nsCOMPtr entries; + rv = directory->GetDirectoryEntries(getter_AddRefs(entries)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + bool persistent = aPersistenceType == PERSISTENCE_TYPE_PERSISTENT; + + bool hasMore; + while (NS_SUCCEEDED((rv = entries->HasMoreElements(&hasMore))) && + hasMore && !mCanceled) { + nsCOMPtr entry; + rv = entries->GetNext(getter_AddRefs(entry)); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + nsCOMPtr originDir = do_QueryInterface(entry); + MOZ_ASSERT(originDir); + + bool isDirectory; + rv = originDir->IsDirectory(&isDirectory); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!isDirectory) { + nsString leafName; + rv = originDir->GetLeafName(leafName); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!IsOSMetadata(leafName)) { + UNKNOWN_FILE_WARNING(leafName); + } + continue; + } + + int64_t timestamp; + bool persisted; + nsCString suffix; + nsCString group; + nsCString origin; + rv = aQuotaManager->GetDirectoryMetadata2WithRestore(originDir, + persistent, + ×tamp, + &persisted, + suffix, + group, + origin); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + if (!mGetAll && + aQuotaManager->IsOriginWhitelistedForPersistentStorage(origin)) { + continue; + } + + OriginUsage* originUsage; + + // We can't store pointers to OriginUsage objects in the hashtable + // since AppendElement() reallocates its internal array buffer as number + // of elements grows. + uint32_t index; + if (mOriginUsagesIndex.Get(origin, &index)) { + originUsage = &mOriginUsages[index]; + } else { + index = mOriginUsages.Length(); + + originUsage = mOriginUsages.AppendElement(); + + originUsage->origin() = origin; + originUsage->persisted() = false; + originUsage->usage() = 0; + + mOriginUsagesIndex.Put(origin, index); + } + + if (aPersistenceType == PERSISTENCE_TYPE_DEFAULT) { + originUsage->persisted() = persisted; + } + + UsageInfo usageInfo; + rv = GetUsageForOrigin(aQuotaManager, + aPersistenceType, + group, + origin, + &usageInfo); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + originUsage->usage() = originUsage->usage() + usageInfo.TotalUsage(); + } + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + return NS_OK; +} + +nsresult +GetUsageOp::DoDirectoryWork(QuotaManager* aQuotaManager) +{ + AssertIsOnIOThread(); + + PROFILER_LABEL("Quota", "GetUsageOp::DoDirectoryWork", + js::ProfileEntry::Category::OTHER); + + nsresult rv; + + for (const PersistenceType type : kAllPersistenceTypes) { + rv = TraverseRepository(aQuotaManager, type); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + } + + return NS_OK; +} + +void +GetUsageOp::GetResponse(UsageRequestResponse& aResponse) +{ + AssertIsOnOwningThread(); + + aResponse = AllUsageResponse(); + + if (!mOriginUsages.IsEmpty()) { + nsTArray& originUsages = + aResponse.get_AllUsageResponse().originUsages(); + + mOriginUsages.SwapElements(originUsages); + } +} + GetOriginUsageOp::GetOriginUsageOp(const UsageRequestParams& aParams) : mParams(aParams.get_OriginUsageParams()) , mGetGroupUsage(aParams.get_OriginUsageParams().getGroupUsage()) diff --git a/dom/quota/PQuota.ipdl b/dom/quota/PQuota.ipdl index 29ec3ae3e546e..566cb02eef76e 100644 --- a/dom/quota/PQuota.ipdl +++ b/dom/quota/PQuota.ipdl @@ -27,6 +27,11 @@ struct InitOriginParams PersistenceType persistenceType; }; +struct AllUsageParams +{ + bool getAll; +}; + struct OriginUsageParams { PrincipalInfo principalInfo; @@ -35,6 +40,7 @@ struct OriginUsageParams union UsageRequestParams { + AllUsageParams; OriginUsageParams; }; diff --git a/dom/quota/PQuotaUsageRequest.ipdl b/dom/quota/PQuotaUsageRequest.ipdl index 682222204fa28..16994e627d1bc 100644 --- a/dom/quota/PQuotaUsageRequest.ipdl +++ b/dom/quota/PQuotaUsageRequest.ipdl @@ -8,6 +8,18 @@ namespace mozilla { namespace dom { namespace quota { +struct OriginUsage +{ + nsCString origin; + bool persisted; + uint64_t usage; +}; + +struct AllUsageResponse +{ + OriginUsage[] originUsages; +}; + struct OriginUsageResponse { uint64_t usage; @@ -18,6 +30,7 @@ struct OriginUsageResponse union UsageRequestResponse { nsresult; + AllUsageResponse; OriginUsageResponse; }; diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp index 9d495591ff0d3..01be3f87e203b 100644 --- a/dom/quota/QuotaManagerService.cpp +++ b/dom/quota/QuotaManagerService.cpp @@ -584,6 +584,31 @@ QuotaManagerService::InitStoragesForPrincipal( return NS_OK; } +NS_IMETHODIMP +QuotaManagerService::GetUsage(nsIQuotaUsageCallback* aCallback, + bool aGetAll, + nsIQuotaUsageRequest** _retval) +{ + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(aCallback); + + RefPtr request = new UsageRequest(aCallback); + + AllUsageParams params; + + params.getAll() = aGetAll; + + nsAutoPtr info(new UsageRequestInfo(request, params)); + + nsresult rv = InitiateRequest(info); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + + request.forget(_retval); + return NS_OK; +} + NS_IMETHODIMP QuotaManagerService::GetUsageForPrincipal(nsIPrincipal* aPrincipal, nsIQuotaUsageCallback* aCallback, diff --git a/dom/quota/QuotaRequests.cpp b/dom/quota/QuotaRequests.cpp index 1f53b9aa50d5c..c9c1cbff6764d 100644 --- a/dom/quota/QuotaRequests.cpp +++ b/dom/quota/QuotaRequests.cpp @@ -91,6 +91,15 @@ RequestBase::GetResultCode(nsresult* aResultCode) return NS_OK; } +UsageRequest::UsageRequest(nsIQuotaUsageCallback* aCallback) + : mCallback(aCallback) + , mBackgroundActor(nullptr) + , mCanceled(false) +{ + AssertIsOnOwningThread(); + MOZ_ASSERT(aCallback); +} + UsageRequest::UsageRequest(nsIPrincipal* aPrincipal, nsIQuotaUsageCallback* aCallback) : RequestBase(aPrincipal) diff --git a/dom/quota/QuotaRequests.h b/dom/quota/QuotaRequests.h index 0fc2f096a43e6..9a51a382085b2 100644 --- a/dom/quota/QuotaRequests.h +++ b/dom/quota/QuotaRequests.h @@ -79,6 +79,8 @@ class UsageRequest final bool mCanceled; public: + explicit UsageRequest(nsIQuotaUsageCallback* aCallback); + UsageRequest(nsIPrincipal* aPrincipal, nsIQuotaUsageCallback* aCallback); diff --git a/dom/quota/QuotaResults.cpp b/dom/quota/QuotaResults.cpp index be02691579e0b..f5dbbd657e2ac 100644 --- a/dom/quota/QuotaResults.cpp +++ b/dom/quota/QuotaResults.cpp @@ -10,6 +10,43 @@ namespace mozilla { namespace dom { namespace quota { +UsageResult::UsageResult(const nsACString& aOrigin, + bool aPersisted, + uint64_t aUsage) + : mOrigin(aOrigin) + , mUsage(aUsage) + , mPersisted(aPersisted) +{ +} + +NS_IMPL_ISUPPORTS(UsageResult, + nsIQuotaUsageResult) + +NS_IMETHODIMP +UsageResult::GetOrigin(nsACString& aOrigin) +{ + aOrigin = mOrigin; + return NS_OK; +} + +NS_IMETHODIMP +UsageResult::GetPersisted(bool* aPersisted) +{ + MOZ_ASSERT(aPersisted); + + *aPersisted = mPersisted; + return NS_OK; +} + +NS_IMETHODIMP +UsageResult::GetUsage(uint64_t* aUsage) +{ + MOZ_ASSERT(aUsage); + + *aUsage = mUsage; + return NS_OK; +} + OriginUsageResult::OriginUsageResult(uint64_t aUsage, uint64_t aFileUsage, uint64_t aLimit) diff --git a/dom/quota/QuotaResults.h b/dom/quota/QuotaResults.h index 4d38d6d8d5788..73fe6b790174d 100644 --- a/dom/quota/QuotaResults.h +++ b/dom/quota/QuotaResults.h @@ -13,6 +13,26 @@ namespace mozilla { namespace dom { namespace quota { +class UsageResult + : public nsIQuotaUsageResult +{ + nsCString mOrigin; + uint64_t mUsage; + bool mPersisted; + +public: + UsageResult(const nsACString& aOrigin, + bool aPersisted, + uint64_t aUsage); + +private: + virtual ~UsageResult() + { } + + NS_DECL_ISUPPORTS + NS_DECL_NSIQUOTAUSAGERESULT +}; + class OriginUsageResult : public nsIQuotaOriginUsageResult { diff --git a/dom/quota/nsIQuotaManagerService.idl b/dom/quota/nsIQuotaManagerService.idl index 99a44476c6ec8..b5c1869a9b680 100644 --- a/dom/quota/nsIQuotaManagerService.idl +++ b/dom/quota/nsIQuotaManagerService.idl @@ -41,6 +41,21 @@ interface nsIQuotaManagerService : nsISupports initStoragesForPrincipal(in nsIPrincipal aPrincipal, in ACString aPersistenceType); + /** + * Schedules an asynchronous callback that will inspect all origins and + * return the total amount of disk space being used by storages for each + * origin separately. + * + * @param aCallback + * The callback that will be called when the usage is available. + * @param aGetAll + * An optional boolean to indicate inspection of all origins, + * including internal ones. + */ + [must_use] nsIQuotaUsageRequest + getUsage(in nsIQuotaUsageCallback aCallback, + [optional] in boolean aGetAll); + /** * Schedules an asynchronous callback that will return the total amount of * disk space being used by storages for the given origin. diff --git a/dom/quota/nsIQuotaRequests.idl b/dom/quota/nsIQuotaRequests.idl index e30a6ebbbfbba..5d7cff3b9350e 100644 --- a/dom/quota/nsIQuotaRequests.idl +++ b/dom/quota/nsIQuotaRequests.idl @@ -23,6 +23,7 @@ interface nsIQuotaRequestBase : nsISupports interface nsIQuotaUsageRequest : nsIQuotaRequestBase { // The result can contain one of these types: + // array of nsIQuotaUsageResult // nsIQuotaOriginUsageResult [must_use] readonly attribute nsIVariant result; diff --git a/dom/quota/nsIQuotaResults.idl b/dom/quota/nsIQuotaResults.idl index 1c787009dcd07..cd7ffd3a02c64 100644 --- a/dom/quota/nsIQuotaResults.idl +++ b/dom/quota/nsIQuotaResults.idl @@ -6,6 +6,16 @@ #include "nsISupports.idl" +[scriptable, function, uuid(d8c9328b-9aa8-4f5d-90e6-482de4a6d5b8)] +interface nsIQuotaUsageResult : nsISupports +{ + readonly attribute ACString origin; + + readonly attribute boolean persisted; + + readonly attribute unsigned long long usage; +}; + [scriptable, function, uuid(96df03d2-116a-493f-bb0b-118c212a6b32)] interface nsIQuotaOriginUsageResult : nsISupports { diff --git a/dom/quota/test/unit/getUsage_profile.zip b/dom/quota/test/unit/getUsage_profile.zip new file mode 100644 index 0000000000000000000000000000000000000000..5144112bde351703f42ab87f817421af09cdae53 GIT binary patch literal 24717 zcmeHPc|26@`&QbON_(P`eVeitBFVlB(L#2zjO?<#EtFIgl0pfI2o2e?B+5?qow8-m z5~1ODjxjT5hQsv!-ao#7n9t{_(MR`nJ@<2;`#SeI_wy*plCRlB27YRk6lCVU%>S{0 z>;Rdy4bn=-$N-_Hx{-`LEdQm(5HM^VD9Bc=`L&9SY|T#Kca>l*P(dtM8d#a@SQuE? zENct2xqp4a=cMCPZLBz=ap(wKP z=w|n!nO(OO6_hmklEk*M-5q$p%h+kZhv-A&XE)i?sG8|HMp`8)q-!agbtF~1hg`yo z(^mi9Inn0Oz|^~bRbks#U(^lSTcYc3J#*ZV|B=`GvF@8AH}h?D?#UXv(|#R3ZdJ?? z*&-+2=T#-7qifybdbGMhwK`1x(34II2|4xS9}S|AYa^Rtgw@sfC7E)sqSLfbn!Y^i zcKw8Vj96>ZDy4%gs|Bgom8v|?=s_ko+I28(`pBv8mhrvx!P#u}dQ+F*p*@j)#*$Tj z*K~f@hcy{B>P@rNii;(*znbCG39q}Etjo`*_x4;T?~7A8w>2fJZ@m0MGu8Lzv05wp zXV#m(FRN4PPZSraJmuJF^r1a2g)O~xFpTY$Q%;+XI_d%4R0a3C2PoODyI=?Ao1k8%4W~~C3 z9kW#Grj{~86wjiLfq?@o6(xSzIjygnnb;W2E!NFjg&N=>S}Y36u>y8!HK`&*p**|t zQNzo+m-Y26m6R?6pIf?3|7?t7C)dcLja-MgdPVXhLA-Hau_TDtZFpdWzJZ~Rt=W9E z>D(yP00$8?K63eqEI}jJ#=zVXxC*QsF_CKm*Z~KuEq}lrpeL}OeGpdot3c1#3TZxn zVNC*F0mmXHF&+j@{+W)5-VNBK0S4VtCOORwY;^Q>Y;@+l4r5#I@~^besjoxSn#Q8kI~E5dL4eR9;mQWoZOQ!_L`cl zuSCxEc;(7{Vf4=!JF=yFABfQKRaXcaUrR`?qrJSx>1Ip+K0cFxO4`fFcs;%B+256R z)w{>g%xj9e?H{-SLyTRV#Z9wHUZS)i_?6)!r<^T1Cepv}Z4=!__a}+-p83z(ch+XX zdnRkWZ%%m9Bh032AL|Qx zbjWN94ZJD#((gh3*Tepva^7}={V_Fz@8w2VQpLtiG7tH(bEvc+BK>G7uZ>)Gr^+bR zlgaCUtL1j;be5&7L5)2r=Dwx& z@zepuR^ggHlkbC%#$$?-`*TbbP9%R2thv;`=b)5|E>h81GpTQPidNg1;gYiEtG6N^q|CB4aBAZ^zs}!%=(BPHm6Od8D^0NE@!r%E+ zQD%6|o$y`X`g&zg`k2)D*gafLGjKUmeeJJ!RpnTxaGwE}cdQH}7j)e!6)yK`?c+s%ITEWz3LX z0au+gFQPBqeiPz;Ra@_Yibqvz)|UICryh54`F}rZJf``gLXTIz|6~vK7ZiPHWw2I} z=Np~4n^`KYXTo!v)4wxVpDRpq_{hzsV{47z4;=f(ogTvxThL$OAbZIrI?x;4-7NB0 z%;Sn3^{dkJhTU}GUsKnw^Ljz87Hj%ml3yZ9HGE(FF7)o|!2xz@&tRH_tnIJkrX3u0 z<(bY^mTDra1!4+L3zth$50xG;kpG3etDcdSh51k%u z^&fjYd$&yEOL=2#R3IPEr;cRB*hX`8`QWX>+#04P_r1E!N{x+-#oUBB>g;{%whoQD zk^_kZ`253Waz86~!ga^*J(zzWyT~EkGk!av+BjF=L-VAOVP1J@{oszU@svsnE}hQN zR{I%Yw3LIvta6rRdzJ$Bf3+|O&CZ)-7w#LH9saWwV=un$C+_R-<-g9(0yk;U&)ZBl zNLqhPB#1{A&A-MrHkNE`Y-UJ39W!I3^}KTb0TL`YV3RCpys@Y>`3Qgy3KctP#tB6d z1_dLM2{YROku*|pwbE6PaJ{KEo>E=geO_s15GI))2i~Dk0Rhb3v4{8dqkUo31g6Wpjqn$hA9D6EmILN1e z8F$olMwd^YP?bBc7~cPYB0;>T>mdKZmftQj-KmY92>$?-Td6DmXyur9g7%pm*|U;H z=Ax+&8q9v5Ae(kmse^F8t z<#$r+JWoU%HQmkP=Xt)u^E}J$<`e#TM=uCm?W=ljQ`pGXo*NmQYP(~!v?)a7&XZ?Z zb?qesg=-6aMZ4le6t|nibyL@7b4xT_>Q4REXU4}~^F2Ax;jrm_Tq$l- zvFKYB!5Jx!V$AZJ*Bgd?&NSyQMmBt}7{3}vsdzu_xH6JE6Q{_H27S`(wV7OwAuSTFerDSX>WWyZ)zqiA9k^Ew5_4&F2=c#Q4~$XO(Bd9F8JMoKO%xjF zH6@oxSi~o%pjv{J9~BjiP!!c`2JA@_QgL?b(XKo5>3#l>ljC=vF@LD4H8^M6`ds}H z8{0_UOB8#^OvoqA)*OepV-hS!dJi^vs3Q(Zj@HX09OQ98l=p;$94-yne6Rh&qx>GN zOGTk?zQu^et7zx>b!0e=tQ}P^L^*up=2o^H<>cQt-o>33v!&hdM8t4F+BL(UzHN>} zah-QU6&h_V-mOChOY)>moI-Awdvhhx(b`haPe%Ny+R3j-rGe63zeg7@`KMEaPF?ek zyj^4Cz#AM?@>$0#_}v};v5%kA1tl~qn;YLfx_JH(VkeWLlQ!+%nl_{20PR_`Lhg9C z(7aX|!y^uPkue5=C7=BRYqofKHFn203&&cW-7L&iXT0~ryh!d{yyV;gNFg|2QA6jbu7x)lmg~4AbG*=4El|pl+(EML6G+z;EEc8t${;esr)Z7Co4LFF@22A#t zWDA;vmYUEvoeNA7YATHF<%&%Z5n60Q)e9aGE1%1PE?#aDdk*@ha{(w$Dq+CzQb}wU z`o?ilv!qGn61ezPgO;5CA6$qu!r-nHohwD>O3}GebpG!Zoy7SU`rs0ue;3q3b0y(k zKo-HVq%=ayPUxG?C5#h_Bn%3^+#}&lCpb%J;R$`yNeU6Hb}q|h`O=fv;m|joOHjcn zDhvg9MTNd+Tn2zNZC!!^UR$B%=YPWhqOvdyRtnIS0(7MST`55SmkUrjph+D24ix+w zs<%W>9t|9H%q`6fIQ5X`nD)&q&q57w!0Ih%TzyttiUBap2@I&-E@7NdZ(&eCy;bJz zmK6ayi|nt6>sp8^L~B{Oa{93O&G#0uZ-Vp|fmCv($wlY^8iK%pDlREhu!_4ZoBeGH zu~Nkx`O?+0rDbca+~>QC9*WPkdv5}uf#zc(r$aS&2{Jg%g&~30Tw(yI;w=L}n&vLS z0He7e19J5O&7eiPi~cv`nVdfuk4VPaiE$UWe0z12`-rpXokJV8&z#@M$v#{ggK6SbL{B`V z%aLH$vAuYgouYO&bLMA*wpSKs(*qZ_j0ZD2&^m(w_0NxFjWYhTRdQnRkxlo^h%++J ztnbU07?laksgZKT$s;u@5&+Up&S*gJ9e^087* z<-1P$$biB#ubimO?NrTepE6DcH63Z>2?&t(*v&i?pmx`L>ZD`*X-}>8V|k|y#o|uV ztCreqeJgEWVLF;Y-u*82lTpkSbqB`t5ubbe=?k36efu@KZYFv{;uegJHnw zxPA26bXLj?R;fysU8>(d^}o)Is=QpW(LTzn_ejK{T6i=Xol)lRd$6pCHK}Vvqd-K4ZG8vZH6OZ9(?;b2Qq1+u&jY@9 z$|nGAFEw>u3TJ0CKOxL%Ci;F}d^5V^m%7>;!EW+n6bg)vC&VTS=*2X4ZO$DY8_>&m zOgG5MQkLfYMIpE=+`1@TuQ|_k@*#a5KY!l2UFjCr`_?Mt3hmm$!<2t0>(svBd--;u zDFXsM9p+DB`6!0Eo&~y*l~u*O_j9^LzE<{COor6xiTcJM`b{MxDg}ax9kPXYr8Kr@ zzRj#65A@h#vWKPoD`l6d|2cavgX%QNk-$MCWtNZ&yPVkURtF6Fdwq5+6Q)l8*wS8_ z#>zir_EJ*$MFiccuxuQhr>?&TlkeNqv8tR_PPkM<<-{Yjv8RPc$Ld? zQsRz@vWWE#wR%X191=tISm|uz`NOW%llhcxJY?*CyXK?v9xbh+hnOy2MLHE{Q&}OS zL7CLu2nR#X7>mJ9#xP;$&jCqMyiYFeM@F$RJ)Nv_YeDOs(0?rvY0(>F@?KGFf3VYw ztPN?(Uj+dwuc+}~4=($4W_G?yX`UEacJ%}TpP%VT z7XW*EdrouYH4`&49ZsZ`5k`4)0o4Tutnz{Yotsc0EC4 zkS57Xu)s(%I8`QV*22(vN&fFxKx7$)1@ORGp%L6#^Nfs9sX=SA!4-F#ZKq|!c@ld| zH26)f2c3Ff)pI~HJDP>7<5csBjb6cADY7z%amw`hy)|+!?$YT&j04B)`j3B{U2T#c z%`oM9=1%9R;Fm05tdYGl!Y|&e+wr14+H`j+qG=~1<1NI-?Q0Hy*0#<`b)0!><2^7+ zH#-$EA*?EwpX+P)WwP#uC3>iD>svJM#B_h`Z@r$*F_B6Uc{JaoY5&%iH9x=oXbKFl zXw`nw!+D+q{nICj(&naGqa<&MF3|J4#obU%Ml~WnReIN4&#!;7Ds3mw^V<*h{2t~> zPZ0O3;Hz(W$@Q?u?o}S;__F~I@ytW^1p>|N`9ROF-$W5x#O;g_A&t;8al=5*Z@^d6 ztsDHUgPTn&2Kq}xa3tcO?{lcR-p#Gcn%C#VSN`E|zi{Fa+C0zJPMRXi`w_54mA zrDmP$`K@SV8_10eO0{jb26}$u#EVO``@eSCeOujGaA=hOIg@u{?P#oN+rA^6Z%6xo z+SX7rnrg7%I*3!0`9FDxbr&Ig*t$Wffn8yV@~{`{+80A0mm95d-a7G$AJI zM09v2ct4#ycsJ0Nn2$LD&KKEqp@q7SV|>(` zfh8f0HS@KAEyX2-4c*`yO-fRv_-bh^rM`>h9x@}rE)9$%`7K~JON3oK>d-OJ>}t4q?G^y_YybsCr( z+jjYV*6!_nXn1mC$i$4sgT2u$eC)xzF*VX>!ko5_?H1*KbH4EkrNup!C@IuCrYVl- zX3an!DmFGXI@9iBPzWS;~sCtW75zmF&IaTM}LT3I9v3-jel|<*1Oau#KjFNqjb(mR? z`M%d}ymhvH@*w7?%OAeszW!PM>nwK1&b(c+i!QT};*5t#n^_>q8o&8;{s}a(c+NeC z?f{e-97O5_>H#JbgAh=4=K325LVbq8!YLu?`V5kCV!pDM8E^}z&%FPN6jq^^<+Yzg zfhJxKXph#i%Yl<<7&>@~CWcY?o7safq>1zrJn*3b73u$y2Slb}c&y0uicGJ_^omUX z56kqb)wJZ8r>F~0TiH9W=-bE!M8U84vscz)&R$ud$ne&v$e`9vL#*LdM@@ApyO@N& z@Dvt|U2sFwKi3}se-fU_0$5z+JQgKckSWIE!oxzaOhJn$fa62v=Z!l$1hBctu^||n z7+)?t2Lx+#8(FsKJG@QEsUU#WMNb65`*h)%AW*A+AXf1&g6Dj?=;2TI^(FQg4S~mQECq$Rhx&U6VFHNySH;8my#y%OAA+Zk$x5cXwhB!_{lEZw~qw^!}L9AK)67fyY5IpBy3xO zB8pIuG&LL|HgsV@7xyOG zSO)kNgXUU118~Li|1|?hK*BP>IGK1`(_sQ1lmgcZHq&AQa`8O7=vFoSRS3dBy9QZt zFyKU4_K^TX7^EcNL9;9e0bcxH;bFsdk^O1V+dpDYGTN0kzYac z(ELh=b2}Ks?n{{`3|KC25+t z!2U}x!oc<<9c+ml3CYv2Y%qbnu;UTxZwlaOUlLY$nad0k*syFc3qjo1Lbwnte6Va5 zzR?7NJ9p{eUf68}o%&tU!3YC<8PtUhMNm{4ph*nI;lxwKp<;s^Y%f~$T3+0@Yy=4v zMLIAp&|zn~IG`K>;NIgT&vcpaf&@D(BTTR_>?MNwKIA`R1PORpMi?IvzrbZ7@KN4L zypQnDgy(gfI3DJ*Ysbc{|Bjwx={cC literal 0 HcmV?d00001 diff --git a/dom/quota/test/unit/head.js b/dom/quota/test/unit/head.js index 89df227644c10..8413ffc9efb37 100644 --- a/dom/quota/test/unit/head.js +++ b/dom/quota/test/unit/head.js @@ -261,11 +261,23 @@ function getPersistedFromMetadata(readBuffer) return !!view[persistedPosition]; } +function grabResultAndContinueHandler(request) +{ + testGenerator.next(request.result); +} + function grabUsageAndContinueHandler(request) { testGenerator.next(request.result.usage); } +function getUsage(usageHandler, getAll) +{ + let request = SpecialPowers._getQuotaManager().getUsage(usageHandler, getAll); + + return request; +} + function getCurrentUsage(usageHandler) { let principal = Cc["@mozilla.org/systemprincipal;1"] diff --git a/dom/quota/test/unit/test_getUsage.js b/dom/quota/test/unit/test_getUsage.js new file mode 100644 index 0000000000000..37d9d197a47bf --- /dev/null +++ b/dom/quota/test/unit/test_getUsage.js @@ -0,0 +1,127 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var testGenerator = testSteps(); + +function* testSteps() +{ + const origins = [ + { + origin: "http://example.com", + persisted: false, + usage: 49152 + }, + + { + origin: "http://localhost", + persisted: false, + usage: 147456 + }, + + { + origin: "http://www.mozilla.org", + persisted: true, + usage: 98304 + } + ]; + + const allOrigins = [ + { + origin: "chrome", + persisted: false, + usage: 147456 + }, + + { + origin: "http://example.com", + persisted: false, + usage: 49152 + }, + + { + origin: "http://localhost", + persisted: false, + usage: 147456 + }, + + { + origin: "http://www.mozilla.org", + persisted: true, + usage: 98304 + } + ]; + + function verifyResult(result, origins) { + ok(result instanceof Array, "Got an array object"); + ok(result.length == origins.length, "Correct number of elements"); + + info("Sorting elements"); + + result.sort(function(a, b) { + let originA = a.origin + let originB = b.origin + + if (originA < originB) { + return -1; + } + if (originA > originB) { + return 1; + } + return 0; + }); + + info("Verifying elements"); + + for (let i = 0; i < result.length; i++) { + let a = result[i]; + let b = origins[i]; + ok(a.origin == b.origin, "Origin equals"); + ok(a.persisted == b.persisted, "Persisted equals"); + ok(a.usage == b.usage, "Usage equals"); + } + } + + info("Clearing"); + + clear(continueToNextStepSync); + yield undefined; + + info("Getting usage"); + + getUsage(grabResultAndContinueHandler, /* getAll */ true); + let result = yield undefined; + + info("Verifying result"); + + verifyResult(result, []); + + info("Installing package"); + + // The profile contains IndexedDB databases placed across the repositories. + // The file create_db.js in the package was run locally, specifically it was + // temporarily added to xpcshell.ini and then executed: + // mach xpcshell-test --interactive dom/quota/test/unit/create_db.js + installPackage("getUsage_profile"); + + info("Getting usage"); + + getUsage(grabResultAndContinueHandler, /* getAll */ false); + result = yield undefined; + + info("Verifying result"); + + verifyResult(result, origins); + + info("Getting usage"); + + getUsage(grabResultAndContinueHandler, /* getAll */ true); + result = yield undefined; + + info("Verifying result"); + + verifyResult(result, allOrigins); + + finishTest(); +} diff --git a/dom/quota/test/unit/xpcshell.ini b/dom/quota/test/unit/xpcshell.ini index 1ad1b8ff0edba..fc825a035c30a 100644 --- a/dom/quota/test/unit/xpcshell.ini +++ b/dom/quota/test/unit/xpcshell.ini @@ -7,6 +7,7 @@ head = head.js support-files = basics_profile.zip defaultStorageUpgrade_profile.zip + getUsage_profile.zip idbSubdirUpgrade1_profile.zip idbSubdirUpgrade2_profile.zip morgueCleanup_profile.zip @@ -18,6 +19,7 @@ support-files = [test_basics.js] [test_defaultStorageUpgrade.js] +[test_getUsage.js] [test_idbSubdirUpgrade.js] [test_morgueCleanup.js] [test_obsoleteOriginAttributesUpgrade.js] From 8edcc55554798f33045ef4b50a0012d16abf36b1 Mon Sep 17 00:00:00 2001 From: Jan Varga Date: Wed, 22 Mar 2017 12:14:09 +0100 Subject: [PATCH 242/300] Bug 1348660 - Part 6: Rename QuotaManager::IsOriginWhitelistedForPersistentStorage() to QuotaManager::IsOriginInternal(); r=btseng --- dom/indexedDB/ActorsParent.cpp | 5 ++--- dom/quota/ActorsParent.cpp | 17 ++++++----------- dom/quota/QuotaManager.h | 2 +- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/dom/indexedDB/ActorsParent.cpp b/dom/indexedDB/ActorsParent.cpp index feaabc9d49f9f..083810be77232 100644 --- a/dom/indexedDB/ActorsParent.cpp +++ b/dom/indexedDB/ActorsParent.cpp @@ -21246,8 +21246,7 @@ FactoryOp::CheckPermission(ContentParent* aContentParent, if (State::Initial == mState) { QuotaManager::GetInfoForChrome(&mSuffix, &mGroup, &mOrigin); - MOZ_ASSERT( - QuotaManager::IsOriginWhitelistedForPersistentStorage(mOrigin)); + MOZ_ASSERT(QuotaManager::IsOriginInternal(mOrigin)); mEnforcingQuota = false; } @@ -21279,7 +21278,7 @@ FactoryOp::CheckPermission(ContentParent* aContentParent, PermissionRequestBase::PermissionValue permission; if (persistenceType == PERSISTENCE_TYPE_PERSISTENT) { - if (QuotaManager::IsOriginWhitelistedForPersistentStorage(origin)) { + if (QuotaManager::IsOriginInternal(origin)) { permission = PermissionRequestBase::kPermissionAllowed; } else { #ifdef IDB_MOBILE diff --git a/dom/quota/ActorsParent.cpp b/dom/quota/ActorsParent.cpp index b503738c0ae36..9e2bceee0044b 100644 --- a/dom/quota/ActorsParent.cpp +++ b/dom/quota/ActorsParent.cpp @@ -5355,10 +5355,9 @@ QuotaManager::GetInfoForChrome(nsACString* aSuffix, // static bool -QuotaManager::IsOriginWhitelistedForPersistentStorage(const nsACString& aOrigin) +QuotaManager::IsOriginInternal(const nsACString& aOrigin) { - // The first prompt and quota tracking is not required for these origins in - // persistent storage. + // The first prompt is not required for these origins. if (aOrigin.EqualsLiteral(kChromeOrigin) || StringBeginsWith(aOrigin, nsDependentCString(kAboutHomeOriginPrefix)) || StringBeginsWith(aOrigin, nsDependentCString(kIndexedDBOriginPrefix)) || @@ -6762,8 +6761,7 @@ GetUsageOp::TraverseRepository(QuotaManager* aQuotaManager, return rv; } - if (!mGetAll && - aQuotaManager->IsOriginWhitelistedForPersistentStorage(origin)) { + if (!mGetAll && aQuotaManager->IsOriginInternal(origin)) { continue; } @@ -8471,9 +8469,7 @@ CreateOrUpgradeDirectoryMetadataHelper::CreateOrUpgradeMetadataFiles() } } else { - bool persistent = - QuotaManager::IsOriginWhitelistedForPersistentStorage( - originProps.mSpec); + bool persistent = QuotaManager::IsOriginInternal(originProps.mSpec); originProps.mTimestamp = GetLastModifiedTime(originDir, persistent); } @@ -8617,9 +8613,8 @@ CreateOrUpgradeDirectoryMetadataHelper::ProcessOriginDirectory( return rv; } - // Move whitelisted origins to new persistent storage. - if (QuotaManager::IsOriginWhitelistedForPersistentStorage( - aOriginProps.mSpec)) { + // Move internal origins to new persistent storage. + if (QuotaManager::IsOriginInternal(aOriginProps.mSpec)) { if (!mPermanentStorageDir) { mPermanentStorageDir = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv); diff --git a/dom/quota/QuotaManager.h b/dom/quota/QuotaManager.h index 176ec5c3fe339..2d4c893cf1ce8 100644 --- a/dom/quota/QuotaManager.h +++ b/dom/quota/QuotaManager.h @@ -398,7 +398,7 @@ class QuotaManager final nsACString* aOrigin); static bool - IsOriginWhitelistedForPersistentStorage(const nsACString& aOrigin); + IsOriginInternal(const nsACString& aOrigin); static void ChromeOrigin(nsACString& aOrigin); From 6696229c7800d2e8fba0081fd2fd62e7ede94842 Mon Sep 17 00:00:00 2001 From: Jorg K Date: Tue, 21 Mar 2017 08:52:00 +0100 Subject: [PATCH 243/300] Bug 1346916 - Skip test_reload.js:test_reloading_a_temp_addon() for Thunderbird. a=aswan --- toolkit/mozapps/extensions/test/xpcshell/test_reload.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_reload.js b/toolkit/mozapps/extensions/test/xpcshell/test_reload.js index 85211fdd6db27..95e68c956ea12 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_reload.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_reload.js @@ -1,6 +1,7 @@ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ +Components.utils.import("resource://gre/modules/AppConstants.jsm"); createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42"); @@ -44,6 +45,8 @@ function* tearDownAddon(addon) { } add_task(function* test_reloading_a_temp_addon() { + if (AppConstants.MOZ_APP_NAME == "thunderbird") + return; yield promiseRestartManager(); yield AddonManager.installTemporaryAddon(do_get_addon(sampleAddon.name)); const addon = yield promiseAddonByID(sampleAddon.id) From 5a49332151e13e9b37fd9e0da2697ddabee9f065 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 22 Mar 2017 10:23:46 +0800 Subject: [PATCH 244/300] Bug 1348931 - remove dead code. r=gerald --- dom/media/mediasink/DecodedAudioDataSink.cpp | 21 -------------------- 1 file changed, 21 deletions(-) diff --git a/dom/media/mediasink/DecodedAudioDataSink.cpp b/dom/media/mediasink/DecodedAudioDataSink.cpp index d6e91cbdebc47..5e8ae205b738f 100644 --- a/dom/media/mediasink/DecodedAudioDataSink.cpp +++ b/dom/media/mediasink/DecodedAudioDataSink.cpp @@ -260,27 +260,6 @@ DecodedAudioDataSink::PopFrames(uint32_t aFrames) AudioDataValue* const mData; }; - class SilentChunk : public AudioStream::Chunk { - public: - SilentChunk(uint32_t aFrames, uint32_t aChannels, uint32_t aRate) - : mFrames(aFrames) - , mChannels(aChannels) - , mRate(aRate) - , mData(MakeUnique(aChannels * aFrames)) { - memset(mData.get(), 0, aChannels * aFrames * sizeof(AudioDataValue)); - } - const AudioDataValue* Data() const { return mData.get(); } - uint32_t Frames() const { return mFrames; } - uint32_t Channels() const { return mChannels; } - uint32_t Rate() const { return mRate; } - AudioDataValue* GetWritable() const { return mData.get(); } - private: - const uint32_t mFrames; - const uint32_t mChannels; - const uint32_t mRate; - UniquePtr mData; - }; - bool needPopping = false; if (!mCurrentData) { // No data in the queue. Return an empty chunk. From 44b236211c82c42c5f59ef2a809ace9e9e9836b1 Mon Sep 17 00:00:00 2001 From: Christoph Kerschbaumer Date: Wed, 22 Mar 2017 13:04:02 +0100 Subject: [PATCH 245/300] Bug 1316305 - Explicilty call .close() for websocket in test. r=baku --- dom/security/test/csp/file_upgrade_insecure.html | 1 + dom/security/test/csp/file_upgrade_insecure_meta.html | 1 + 2 files changed, 2 insertions(+) diff --git a/dom/security/test/csp/file_upgrade_insecure.html b/dom/security/test/csp/file_upgrade_insecure.html index 0daaa853ebb2b..e3243c1bbe9cd 100644 --- a/dom/security/test/csp/file_upgrade_insecure.html +++ b/dom/security/test/csp/file_upgrade_insecure.html @@ -57,6 +57,7 @@ else { window.parent.postMessage({result: "websocket-error"}, "*"); } + mySocket.close(); }; mySocket.onerror = function(e) { // debug information for Bug 1316305 diff --git a/dom/security/test/csp/file_upgrade_insecure_meta.html b/dom/security/test/csp/file_upgrade_insecure_meta.html index 5f65e78ec30b9..15f565a6b8a72 100644 --- a/dom/security/test/csp/file_upgrade_insecure_meta.html +++ b/dom/security/test/csp/file_upgrade_insecure_meta.html @@ -58,6 +58,7 @@ else { window.parent.postMessage({result: "websocket-error"}, "*"); } + mySocket.close(); }; mySocket.onerror = function(e) { window.parent.postMessage({result: "websocket-unexpected-error"}, "*"); From fe1131cfece89ecd19396aff9f9d83f32c130baa Mon Sep 17 00:00:00 2001 From: Shawn Huang Date: Wed, 22 Mar 2017 20:14:52 +0800 Subject: [PATCH 246/300] Bug 1319306 - Change onreadystatechange assertion to a minimum of 2 rather than 10, r=annevk --- .../tests/XMLHttpRequest/event-readystatechange-loaded.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/web-platform/tests/XMLHttpRequest/event-readystatechange-loaded.htm b/testing/web-platform/tests/XMLHttpRequest/event-readystatechange-loaded.htm index de6debe6babc7..452efafae9f73 100644 --- a/testing/web-platform/tests/XMLHttpRequest/event-readystatechange-loaded.htm +++ b/testing/web-platform/tests/XMLHttpRequest/event-readystatechange-loaded.htm @@ -24,7 +24,7 @@ } if (client.readyState === 4) { - assert_equals(countedLoading, 10, "LOADING state change may be emitted multiple times"); + assert_greater_than(countedLoading, 1, "LOADING state change may be emitted multiple times"); test.done(); } From a71fd35ce9404fea2674031375ce8f344f30f8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A3o=20Gottwald?= Date: Wed, 22 Mar 2017 13:28:58 +0100 Subject: [PATCH 247/300] Bug 1349501 - Let _beginRemoveTab skip the whole permitUnload block for tabs that don't have content attached. r=kevinhowjones --- browser/base/content/tabbrowser.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 5335b574d71a9..48ecdbcccefc8 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -2630,13 +2630,15 @@ var browser = this.getBrowserForTab(aTab); - if (!aTab._pendingPermitUnload && !aAdoptedByTab && !aSkipPermitUnload) { + if (!aTab._pendingPermitUnload && + !aSkipPermitUnload && + aTab.linkedPanel && + !aAdoptedByTab) { // We need to block while calling permitUnload() because it // processes the event queue and may lead to another removeTab() // call before permitUnload() returns. aTab._pendingPermitUnload = true; - let {permitUnload, timedOut} = aTab.linkedPanel ? - browser.permitUnload() : {permitUnload: true, timedOut: false}; + let {permitUnload, timedOut} = browser.permitUnload(); delete aTab._pendingPermitUnload; // If we were closed during onbeforeunload, we return false now // so we don't (try to) close the same tab again. Of course, we From e0bd6bc657ae6fbe09ab8f67f453147c3714a1fb Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Wed, 22 Mar 2017 13:30:05 +0100 Subject: [PATCH 248/300] Backed out changeset 6bfcef53d382 (bug 1348877) for failing web-platform-test /storage/interfaces.https.html. r=backout --- testing/web-platform/meta/MANIFEST.json | 8 ++++---- .../storage/{interfaces.https.html => interfaces.html} | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename testing/web-platform/tests/storage/{interfaces.https.html => interfaces.html} (100%) diff --git a/testing/web-platform/meta/MANIFEST.json b/testing/web-platform/meta/MANIFEST.json index 9aa9e0f41755b..9f8d07bdf355d 100644 --- a/testing/web-platform/meta/MANIFEST.json +++ b/testing/web-platform/meta/MANIFEST.json @@ -120882,9 +120882,9 @@ {} ] ], - "storage/interfaces.https.html": [ + "storage/interfaces.html": [ [ - "/storage/interfaces.https.html", + "/storage/interfaces.html", {} ] ], @@ -181322,7 +181322,7 @@ "testharness" ], "html/webappapis/idle-callbacks/callback-removed-frame.html": [ - "ff034276659407d2dea91d2b0ed0e5919b875904", + "79b4a278f0e35646cfdffeebf8f0523e2772bc9b", "testharness" ], "html/webappapis/idle-callbacks/callback-suspended.html": [ @@ -203621,7 +203621,7 @@ "6e5db2d0c2f5d2d8f1e2d04da953a3f2c50bec7a", "testharness" ], - "storage/interfaces.https.html": [ + "storage/interfaces.html": [ "76fa61c3a87485266a7f9d6f66e5d08bb7881ff7", "testharness" ], diff --git a/testing/web-platform/tests/storage/interfaces.https.html b/testing/web-platform/tests/storage/interfaces.html similarity index 100% rename from testing/web-platform/tests/storage/interfaces.https.html rename to testing/web-platform/tests/storage/interfaces.html From 6a03d19543c320739502be0b6a433d6376cf53c5 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Wed, 22 Mar 2017 09:05:36 -0400 Subject: [PATCH 249/300] Bug 1343499 - Expose native image sizes to imagelib users. r=tnikkel --- image/DynamicImage.cpp | 6 ++ image/DynamicImage.h | 1 + image/FrameTimeout.h | 119 ++++++++++++++++++++++ image/ImageMetadata.h | 13 ++- image/ImageOps.cpp | 110 ++++++++++++++++++-- image/ImageOps.h | 61 ++++++++++- image/ImageWrapper.cpp | 6 ++ image/ImageWrapper.h | 1 + image/OrientedImage.cpp | 16 +++ image/OrientedImage.h | 1 + image/RasterImage.cpp | 19 ++++ image/RasterImage.h | 2 + image/VectorImage.cpp | 7 ++ image/VectorImage.h | 1 + image/decoders/nsICODecoder.cpp | 2 + image/imgFrame.h | 101 +----------------- image/imgIContainer.idl | 4 + image/moz.build | 2 + image/test/gtest/Common.cpp | 6 ++ image/test/gtest/Common.h | 2 + image/test/gtest/TestDecodeToSurface.cpp | 84 +++++++++++++-- image/test/gtest/TestDecoders.cpp | 84 +++++++++++++++ image/test/gtest/green-multiple-sizes.ico | Bin 0 -> 14144 bytes image/test/gtest/moz.build | 1 + 24 files changed, 530 insertions(+), 119 deletions(-) create mode 100644 image/FrameTimeout.h create mode 100644 image/test/gtest/green-multiple-sizes.ico diff --git a/image/DynamicImage.cpp b/image/DynamicImage.cpp index d6444066a9e92..47c920944c3ec 100644 --- a/image/DynamicImage.cpp +++ b/image/DynamicImage.cpp @@ -127,6 +127,12 @@ DynamicImage::GetHeight(int32_t* aHeight) return NS_OK; } +nsresult +DynamicImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + NS_IMETHODIMP DynamicImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/DynamicImage.h b/image/DynamicImage.h index a39a29b8e37ed..09c6ed550a257 100644 --- a/image/DynamicImage.h +++ b/image/DynamicImage.h @@ -31,6 +31,7 @@ class DynamicImage : public Image } // Inherited methods from Image. + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t SizeOfSourceWithComputedFallback( MallocSizeOf aMallocSizeOf) const override; diff --git a/image/FrameTimeout.h b/image/FrameTimeout.h new file mode 100644 index 0000000000000..4070bba65b2b5 --- /dev/null +++ b/image/FrameTimeout.h @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_image_FrameTimeout_h +#define mozilla_image_FrameTimeout_h + +#include +#include "mozilla/Assertions.h" + +namespace mozilla { +namespace image { + +/** + * FrameTimeout wraps a frame timeout value (measured in milliseconds) after + * first normalizing it. This normalization is necessary because some tools + * generate incorrect frame timeout values which we nevertheless have to + * support. For this reason, code that deals with frame timeouts should always + * use a FrameTimeout value rather than the raw value from the image header. + */ +struct FrameTimeout +{ + /** + * @return a FrameTimeout of zero. This should be used only for math + * involving FrameTimeout values. You can't obtain a zero FrameTimeout from + * FromRawMilliseconds(). + */ + static FrameTimeout Zero() { return FrameTimeout(0); } + + /// @return an infinite FrameTimeout. + static FrameTimeout Forever() { return FrameTimeout(-1); } + + /// @return a FrameTimeout obtained by normalizing a raw timeout value. + static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) + { + // Normalize all infinite timeouts to the same value. + if (aRawMilliseconds < 0) { + return FrameTimeout::Forever(); + } + + // Very small timeout values are problematic for two reasons: we don't want + // to burn energy redrawing animated images extremely fast, and broken tools + // generate these values when they actually want a "default" value, so such + // images won't play back right without normalization. For some context, + // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical + // behavior of IE and Opera was: + // IE 6/Win: + // 10 - 50ms is normalized to 100ms. + // >50ms is used unnormalized. + // Opera 7 final/Win: + // 10ms is normalized to 100ms. + // >10ms is used unnormalized. + if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { + return FrameTimeout(100); + } + + // The provided timeout value is OK as-is. + return FrameTimeout(aRawMilliseconds); + } + + bool operator==(const FrameTimeout& aOther) const + { + return mTimeout == aOther.mTimeout; + } + + bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } + + FrameTimeout operator+(const FrameTimeout& aOther) + { + if (*this == Forever() || aOther == Forever()) { + return Forever(); + } + + return FrameTimeout(mTimeout + aOther.mTimeout); + } + + FrameTimeout& operator+=(const FrameTimeout& aOther) + { + *this = *this + aOther; + return *this; + } + + /** + * @return this FrameTimeout's value in milliseconds. Illegal to call on a + * an infinite FrameTimeout value. + */ + uint32_t AsMilliseconds() const + { + if (*this == Forever()) { + MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); + return 100; // Fail to something sane. + } + + return uint32_t(mTimeout); + } + + /** + * @return this FrameTimeout value encoded so that non-negative values + * represent a timeout in milliseconds, and -1 represents an infinite + * timeout. + * + * XXX(seth): This is a backwards compatibility hack that should be removed. + */ + int32_t AsEncodedValueDeprecated() const { return mTimeout; } + +private: + explicit FrameTimeout(int32_t aTimeout) + : mTimeout(aTimeout) + { } + + int32_t mTimeout; +}; + +} // namespace image +} // namespace mozilla + +#endif // mozilla_image_FrameTimeout_h diff --git a/image/ImageMetadata.h b/image/ImageMetadata.h index 05f5729802c71..b1a2edfb03fde 100644 --- a/image/ImageMetadata.h +++ b/image/ImageMetadata.h @@ -11,12 +11,11 @@ #include "mozilla/Maybe.h" #include "nsSize.h" #include "Orientation.h" +#include "FrameTimeout.h" namespace mozilla { namespace image { -class RasterImage; - // The metadata about an image that decoders accumulate as they decode. class ImageMetadata { @@ -64,6 +63,13 @@ class ImageMetadata nsIntSize GetSize() const { return *mSize; } bool HasSize() const { return mSize.isSome(); } + void AddNativeSize(const nsIntSize& aSize) + { + mNativeSizes.AppendElement(aSize); + } + + const nsTArray& GetNativeSizes() const { return mNativeSizes; } + Orientation GetOrientation() const { return *mOrientation; } bool HasOrientation() const { return mOrientation.isSome(); } @@ -90,6 +96,9 @@ class ImageMetadata Maybe mSize; Maybe mOrientation; + // Sizes the image can natively decode to. + nsTArray mNativeSizes; + bool mHasAnimation : 1; }; diff --git a/image/ImageOps.cpp b/image/ImageOps.cpp index d1d5da283642d..fb4fc8fb70751 100644 --- a/image/ImageOps.cpp +++ b/image/ImageOps.cpp @@ -14,6 +14,7 @@ #include "FrozenImage.h" #include "IDecodingTask.h" #include "Image.h" +#include "ImageMetadata.h" #include "imgIContainer.h" #include "mozilla/gfx/2D.h" #include "nsStreamUtils.h" @@ -79,10 +80,27 @@ ImageOps::CreateFromDrawable(gfxDrawable* aDrawable) return drawableImage.forget(); } -/* static */ already_AddRefed -ImageOps::DecodeToSurface(nsIInputStream* aInputStream, - const nsACString& aMimeType, - uint32_t aFlags) +class ImageOps::ImageBufferImpl final : public ImageOps::ImageBuffer { +public: + ImageBufferImpl(already_AddRefed aSourceBuffer) + : mSourceBuffer(aSourceBuffer) + { } + +protected: + ~ImageBufferImpl() override { } + + virtual already_AddRefed GetSourceBuffer() + { + RefPtr sourceBuffer = mSourceBuffer; + return sourceBuffer.forget(); + } + +private: + RefPtr mSourceBuffer; +}; + +/* static */ already_AddRefed +ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) { MOZ_ASSERT(aInputStream); @@ -107,7 +125,7 @@ ImageOps::DecodeToSurface(nsIInputStream* aInputStream, } // Write the data into a SourceBuffer. - NotNull> sourceBuffer = WrapNotNull(new SourceBuffer()); + RefPtr sourceBuffer = new SourceBuffer(); sourceBuffer->ExpectLength(length); rv = sourceBuffer->AppendFromInputStream(inputStream, length); if (NS_FAILED(rv)) { @@ -122,12 +140,90 @@ ImageOps::DecodeToSurface(nsIInputStream* aInputStream, } sourceBuffer->Complete(NS_OK); + RefPtr imageBuffer = new ImageBufferImpl(sourceBuffer.forget()); + return imageBuffer.forget(); +} + +/* static */ nsresult +ImageOps::DecodeMetadata(nsIInputStream* aInputStream, + const nsACString& aMimeType, + ImageMetadata& aMetadata) +{ + RefPtr buffer = CreateImageBuffer(aInputStream); + return DecodeMetadata(buffer, aMimeType, aMetadata); +} + +/* static */ nsresult +ImageOps::DecodeMetadata(ImageBuffer* aBuffer, + const nsACString& aMimeType, + ImageMetadata& aMetadata) +{ + if (!aBuffer) { + return NS_ERROR_FAILURE; + } + + RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); + if (NS_WARN_IF(!sourceBuffer)) { + return NS_ERROR_FAILURE; + } + + // Create a decoder. + DecoderType decoderType = + DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); + RefPtr decoder = + DecoderFactory::CreateAnonymousMetadataDecoder(decoderType, + WrapNotNull(sourceBuffer)); + if (!decoder) { + return NS_ERROR_FAILURE; + } + + // Run the decoder synchronously. + RefPtr task = new AnonymousDecodingTask(WrapNotNull(decoder)); + task->Run(); + if (!decoder->GetDecodeDone() || decoder->HasError()) { + return NS_ERROR_FAILURE; + } + + aMetadata = decoder->GetImageMetadata(); + if (aMetadata.GetNativeSizes().IsEmpty() && aMetadata.HasSize()) { + aMetadata.AddNativeSize(aMetadata.GetSize()); + } + + return NS_OK; +} + +/* static */ already_AddRefed +ImageOps::DecodeToSurface(nsIInputStream* aInputStream, + const nsACString& aMimeType, + uint32_t aFlags, + Maybe aSize /* = Nothing() */) +{ + RefPtr buffer = CreateImageBuffer(aInputStream); + return DecodeToSurface(buffer, aMimeType, aFlags, aSize); +} + +/* static */ already_AddRefed +ImageOps::DecodeToSurface(ImageBuffer* aBuffer, + const nsACString& aMimeType, + uint32_t aFlags, + Maybe aSize /* = Nothing() */) +{ + if (!aBuffer) { + return nullptr; + } + + RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); + if (NS_WARN_IF(!sourceBuffer)) { + return nullptr; + } + // Create a decoder. DecoderType decoderType = DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); RefPtr decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, - Nothing(), ToSurfaceFlags(aFlags)); + DecoderFactory::CreateAnonymousDecoder(decoderType, + WrapNotNull(sourceBuffer), + aSize, ToSurfaceFlags(aFlags)); if (!decoder) { return nullptr; } diff --git a/image/ImageOps.h b/image/ImageOps.h index 7a8e19be34410..5a089fd16b030 100644 --- a/image/ImageOps.h +++ b/image/ImageOps.h @@ -9,6 +9,7 @@ #include "nsCOMPtr.h" #include "nsRect.h" +#include "ImageMetadata.h" class gfxDrawable; class imgIContainer; @@ -24,10 +25,23 @@ namespace image { class Image; struct Orientation; +class SourceBuffer; class ImageOps { public: + class ImageBuffer { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageOps::ImageBuffer); + protected: + friend class ImageOps; + + ImageBuffer() { } + virtual ~ImageBuffer() { } + + virtual already_AddRefed GetSourceBuffer() = 0; + }; + /** * Creates a version of an existing image which does not animate and is frozen * at the first frame. @@ -74,6 +88,39 @@ class ImageOps static already_AddRefed CreateFromDrawable(gfxDrawable* aDrawable); + /** + * Create a buffer to be used with DecodeMetadata and DecodeToSurface. Reusing + * an ImageBuffer representing the given input stream is more efficient if one + * has multiple Decode* calls to make on that stream. + * + * @param aInputStream An input stream containing an encoded image. + * @return An image buffer derived from the input stream. + */ + static already_AddRefed + CreateImageBuffer(nsIInputStream* aInputStream); + + /** + * Decodes an image's metadata from an nsIInputStream into the given + * structure. This function may be called off-main-thread. + * + * @param aInputStream An input stream containing an encoded image. + * @param aMimeType The MIME type of the image. + * @param aMetadata Where the image metadata is stored upon success. + * @return The status of the operation. + */ + static nsresult + DecodeMetadata(nsIInputStream* aInputStream, + const nsACString& aMimeType, + ImageMetadata& aMetadata); + + /** + * Same as above but takes an ImageBuffer instead of nsIInputStream. + */ + static nsresult + DecodeMetadata(ImageBuffer* aBuffer, + const nsACString& aMimeType, + ImageMetadata& aMetadata); + /** * Decodes an image from an nsIInputStream directly into a SourceSurface, * without ever creating an Image or imgIContainer (which are mostly @@ -89,9 +136,21 @@ class ImageOps static already_AddRefed DecodeToSurface(nsIInputStream* aInputStream, const nsACString& aMimeType, - uint32_t aFlags); + uint32_t aFlags, + Maybe aSize = Nothing()); + + /** + * Same as above but takes an ImageBuffer instead of nsIInputStream. + */ + static already_AddRefed + DecodeToSurface(ImageBuffer* aBuffer, + const nsACString& aMimeType, + uint32_t aFlags, + Maybe aSize = Nothing()); private: + class ImageBufferImpl; + // This is a static utility class, so disallow instantiation. virtual ~ImageOps() = 0; }; diff --git a/image/ImageWrapper.cpp b/image/ImageWrapper.cpp index dfc76641fd6f4..8524799045679 100644 --- a/image/ImageWrapper.cpp +++ b/image/ImageWrapper.cpp @@ -139,6 +139,12 @@ ImageWrapper::GetHeight(int32_t* aHeight) return mInnerImage->GetHeight(aHeight); } +nsresult +ImageWrapper::GetNativeSizes(nsTArray& aNativeSizes) const +{ + return mInnerImage->GetNativeSizes(aNativeSizes); +} + NS_IMETHODIMP ImageWrapper::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/ImageWrapper.h b/image/ImageWrapper.h index 94cf0948b537c..19e9cb8582329 100644 --- a/image/ImageWrapper.h +++ b/image/ImageWrapper.h @@ -22,6 +22,7 @@ class ImageWrapper : public Image NS_DECL_IMGICONTAINER // Inherited methods from Image. + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t diff --git a/image/OrientedImage.cpp b/image/OrientedImage.cpp index 951b0acbc94d1..79767e2a796ab 100644 --- a/image/OrientedImage.cpp +++ b/image/OrientedImage.cpp @@ -46,6 +46,22 @@ OrientedImage::GetHeight(int32_t* aHeight) } } +nsresult +OrientedImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + nsresult rv = InnerImage()->GetNativeSizes(aNativeSizes); + + if (mOrientation.SwapsWidthAndHeight()) { + auto i = aNativeSizes.Length(); + while (i > 0) { + --i; + swap(aNativeSizes[i].width, aNativeSizes[i].height); + } + } + + return rv; +} + NS_IMETHODIMP OrientedImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/OrientedImage.h b/image/OrientedImage.h index 2edf05de9f50c..d1291ea74b20a 100644 --- a/image/OrientedImage.h +++ b/image/OrientedImage.h @@ -30,6 +30,7 @@ class OrientedImage : public ImageWrapper NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override; NS_IMETHOD_(already_AddRefed) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index b987448502951..b3da4ff3697e6 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -220,6 +220,24 @@ RasterImage::GetHeight(int32_t* aHeight) return NS_OK; } +//****************************************************************************** +nsresult +RasterImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + if (mError) { + return NS_ERROR_FAILURE; + } + + if (mNativeSizes.IsEmpty()) { + aNativeSizes.Clear(); + aNativeSizes.AppendElement(mSize); + } else { + aNativeSizes = mNativeSizes; + } + + return NS_OK; +} + //****************************************************************************** NS_IMETHODIMP RasterImage::GetIntrinsicSize(nsSize* aSize) @@ -703,6 +721,7 @@ RasterImage::SetMetadata(const ImageMetadata& aMetadata, // Set the size and flag that we have it. mSize = size; mOrientation = orientation; + mNativeSizes = aMetadata.GetNativeSizes(); mHasSize = true; } diff --git a/image/RasterImage.h b/image/RasterImage.h index 09fa18b4df655..023985669a7a7 100644 --- a/image/RasterImage.h +++ b/image/RasterImage.h @@ -160,6 +160,7 @@ class RasterImage final : public ImageResource NS_DECL_IMGICONTAINERDEBUG #endif + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual nsresult StartAnimation() override; virtual nsresult StopAnimation() override; @@ -380,6 +381,7 @@ class RasterImage final : public ImageResource private: // data nsIntSize mSize; + nsTArray mNativeSizes; Orientation mOrientation; /// If this has a value, we're waiting for SetSize() to send the load event. diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index fa3ecb8bc049a..7c650fc7545ca 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -520,6 +520,13 @@ VectorImage::GetWidth(int32_t* aWidth) return NS_OK; } +//****************************************************************************** +nsresult +VectorImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + //****************************************************************************** NS_IMETHODIMP_(void) VectorImage::RequestRefresh(const TimeStamp& aTime) diff --git a/image/VectorImage.h b/image/VectorImage.h index cb55e057753cd..a05c92f3cf380 100644 --- a/image/VectorImage.h +++ b/image/VectorImage.h @@ -34,6 +34,7 @@ class VectorImage final : public ImageResource, // (no public constructor - use ImageFactory) // Methods inherited from Image + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual size_t SizeOfSourceWithComputedFallback(MallocSizeOf aMallocSizeOf) const override; virtual void CollectSizeOfSurfaces(nsTArray& aCounters, diff --git a/image/decoders/nsICODecoder.cpp b/image/decoders/nsICODecoder.cpp index 85b3c139b0d78..d8171431ea837 100644 --- a/image/decoders/nsICODecoder.cpp +++ b/image/decoders/nsICODecoder.cpp @@ -242,6 +242,8 @@ nsICODecoder::ReadDirEntry(const char* aData) } } + mImageMetadata.AddNativeSize(entrySize); + if (desiredSize) { // Calculate the delta between this resource's size and the desired size, so // we can see if it is better than our current-best option. In the case of diff --git a/image/imgFrame.h b/image/imgFrame.h index 77ff3507b1771..bd858e088dcff 100644 --- a/image/imgFrame.h +++ b/image/imgFrame.h @@ -11,6 +11,7 @@ #include "mozilla/MemoryReporting.h" #include "mozilla/Monitor.h" #include "mozilla/Move.h" +#include "FrameTimeout.h" #include "gfxDrawable.h" #include "imgIContainer.h" #include "MainThreadUtils.h" @@ -46,106 +47,6 @@ enum class Opacity : uint8_t { SOME_TRANSPARENCY }; -/** - * FrameTimeout wraps a frame timeout value (measured in milliseconds) after - * first normalizing it. This normalization is necessary because some tools - * generate incorrect frame timeout values which we nevertheless have to - * support. For this reason, code that deals with frame timeouts should always - * use a FrameTimeout value rather than the raw value from the image header. - */ -struct FrameTimeout -{ - /** - * @return a FrameTimeout of zero. This should be used only for math - * involving FrameTimeout values. You can't obtain a zero FrameTimeout from - * FromRawMilliseconds(). - */ - static FrameTimeout Zero() { return FrameTimeout(0); } - - /// @return an infinite FrameTimeout. - static FrameTimeout Forever() { return FrameTimeout(-1); } - - /// @return a FrameTimeout obtained by normalizing a raw timeout value. - static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) - { - // Normalize all infinite timeouts to the same value. - if (aRawMilliseconds < 0) { - return FrameTimeout::Forever(); - } - - // Very small timeout values are problematic for two reasons: we don't want - // to burn energy redrawing animated images extremely fast, and broken tools - // generate these values when they actually want a "default" value, so such - // images won't play back right without normalization. For some context, - // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical - // behavior of IE and Opera was: - // IE 6/Win: - // 10 - 50ms is normalized to 100ms. - // >50ms is used unnormalized. - // Opera 7 final/Win: - // 10ms is normalized to 100ms. - // >10ms is used unnormalized. - if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { - return FrameTimeout(100); - } - - // The provided timeout value is OK as-is. - return FrameTimeout(aRawMilliseconds); - } - - bool operator==(const FrameTimeout& aOther) const - { - return mTimeout == aOther.mTimeout; - } - - bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } - - FrameTimeout operator+(const FrameTimeout& aOther) - { - if (*this == Forever() || aOther == Forever()) { - return Forever(); - } - - return FrameTimeout(mTimeout + aOther.mTimeout); - } - - FrameTimeout& operator+=(const FrameTimeout& aOther) - { - *this = *this + aOther; - return *this; - } - - /** - * @return this FrameTimeout's value in milliseconds. Illegal to call on a - * an infinite FrameTimeout value. - */ - uint32_t AsMilliseconds() const - { - if (*this == Forever()) { - MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); - return 100; // Fail to something sane. - } - - return uint32_t(mTimeout); - } - - /** - * @return this FrameTimeout value encoded so that non-negative values - * represent a timeout in milliseconds, and -1 represents an infinite - * timeout. - * - * XXX(seth): This is a backwards compatibility hack that should be removed. - */ - int32_t AsEncodedValueDeprecated() const { return mTimeout; } - -private: - explicit FrameTimeout(int32_t aTimeout) - : mTimeout(aTimeout) - { } - - int32_t mTimeout; -}; - /** * AnimationData contains all of the information necessary for using an imgFrame * as part of an animation. diff --git a/image/imgIContainer.idl b/image/imgIContainer.idl index 640eae3525587..eed28e2668d96 100644 --- a/image/imgIContainer.idl +++ b/image/imgIContainer.idl @@ -90,6 +90,10 @@ interface imgIContainer : nsISupports */ readonly attribute int32_t height; + %{C++ + virtual nsresult GetNativeSizes(nsTArray& aNativeSizes) const = 0; + %} + /** * The intrinsic size of this image in appunits. If the image has no intrinsic * size in a dimension, -1 will be returned for that dimension. In the case of diff --git a/image/moz.build b/image/moz.build index c3a3a610fd8e9..8ccb30247e91d 100644 --- a/image/moz.build +++ b/image/moz.build @@ -37,8 +37,10 @@ XPIDL_MODULE = 'imglib2' EXPORTS += [ 'DrawResult.h', + 'FrameTimeout.h', 'ImageCacheKey.h', 'ImageLogging.h', + 'ImageMetadata.h', 'ImageOps.h', 'ImageRegion.h', 'imgLoader.h', diff --git a/image/test/gtest/Common.cpp b/image/test/gtest/Common.cpp index 4be34461c71ca..4bc7fce1c32e3 100644 --- a/image/test/gtest/Common.cpp +++ b/image/test/gtest/Common.cpp @@ -679,5 +679,11 @@ ImageTestCase TruncatedSmallGIFTestCase() return ImageTestCase("green-1x1-truncated.gif", "image/gif", IntSize(1, 1)); } +ImageTestCase GreenMultipleSizesICOTestCase() +{ + return ImageTestCase("green-multiple-sizes.ico", "image/x-icon", + IntSize(256, 256)); +} + } // namespace image } // namespace mozilla diff --git a/image/test/gtest/Common.h b/image/test/gtest/Common.h index 33fc26e750f82..63b8b9b700262 100644 --- a/image/test/gtest/Common.h +++ b/image/test/gtest/Common.h @@ -414,6 +414,8 @@ ImageTestCase DownscaledTransparentICOWithANDMaskTestCase(); ImageTestCase TruncatedSmallGIFTestCase(); +ImageTestCase GreenMultipleSizesICOTestCase(); + } // namespace image } // namespace mozilla diff --git a/image/test/gtest/TestDecodeToSurface.cpp b/image/test/gtest/TestDecodeToSurface.cpp index dd22d4308d9b1..b4b011528d97f 100644 --- a/image/test/gtest/TestDecodeToSurface.cpp +++ b/image/test/gtest/TestDecodeToSurface.cpp @@ -27,9 +27,11 @@ class DecodeToSurfaceRunnable : public Runnable public: DecodeToSurfaceRunnable(RefPtr& aSurface, nsIInputStream* aInputStream, + ImageOps::ImageBuffer* aImageBuffer, const ImageTestCase& aTestCase) : mSurface(aSurface) , mInputStream(aInputStream) + , mImageBuffer(aImageBuffer) , mTestCase(aTestCase) { } @@ -41,16 +43,35 @@ class DecodeToSurfaceRunnable : public Runnable void Go() { - mSurface = - ImageOps::DecodeToSurface(mInputStream, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT); + Maybe outputSize; + if (mTestCase.mOutputSize != mTestCase.mSize) { + outputSize.emplace(mTestCase.mOutputSize); + } + + if (mImageBuffer) { + mSurface = + ImageOps::DecodeToSurface(mImageBuffer, + nsDependentCString(mTestCase.mMimeType), + imgIContainer::DECODE_FLAGS_DEFAULT, + outputSize); + } else { + mSurface = + ImageOps::DecodeToSurface(mInputStream, + nsDependentCString(mTestCase.mMimeType), + imgIContainer::DECODE_FLAGS_DEFAULT, + outputSize); + } ASSERT_TRUE(mSurface != nullptr); EXPECT_TRUE(mSurface->IsDataSourceSurface()); EXPECT_TRUE(mSurface->GetFormat() == SurfaceFormat::B8G8R8X8 || mSurface->GetFormat() == SurfaceFormat::B8G8R8A8); - EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); + + if (outputSize) { + EXPECT_EQ(*outputSize, mSurface->GetSize()); + } else { + EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); + } EXPECT_TRUE(IsSolidColor(mSurface, BGRAColor::Green(), mTestCase.mFlags & TEST_CASE_IS_FUZZY ? 1 : 0)); @@ -59,14 +80,19 @@ class DecodeToSurfaceRunnable : public Runnable private: RefPtr& mSurface; nsCOMPtr mInputStream; + RefPtr mImageBuffer; ImageTestCase mTestCase; }; static void -RunDecodeToSurface(const ImageTestCase& aTestCase) +RunDecodeToSurface(const ImageTestCase& aTestCase, + ImageOps::ImageBuffer* aImageBuffer = nullptr) { - nsCOMPtr inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); + nsCOMPtr inputStream; + if (!aImageBuffer) { + inputStream = LoadFile(aTestCase.mPath); + ASSERT_TRUE(inputStream != nullptr); + } nsCOMPtr thread; nsresult rv = @@ -77,7 +103,7 @@ RunDecodeToSurface(const ImageTestCase& aTestCase) // DecodeToSurface doesn't require any main-thread-only code. RefPtr surface; nsCOMPtr runnable = - new DecodeToSurfaceRunnable(surface, inputStream, aTestCase); + new DecodeToSurfaceRunnable(surface, inputStream, aImageBuffer, aTestCase); thread->Dispatch(runnable, nsIThread::DISPATCH_SYNC); thread->Shutdown(); @@ -122,3 +148,43 @@ TEST_F(ImageDecodeToSurface, Corrupt) imgIContainer::DECODE_FLAGS_DEFAULT); EXPECT_TRUE(surface == nullptr); } + +TEST_F(ImageDecodeToSurface, ICOMultipleSizes) +{ + ImageTestCase testCase = GreenMultipleSizesICOTestCase(); + + nsCOMPtr inputStream = LoadFile(testCase.mPath); + ASSERT_TRUE(inputStream != nullptr); + + RefPtr buffer = + ImageOps::CreateImageBuffer(inputStream); + ASSERT_TRUE(buffer != nullptr); + + ImageMetadata metadata; + nsresult rv = ImageOps::DecodeMetadata(buffer, + nsDependentCString(testCase.mMimeType), + metadata); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_TRUE(metadata.HasSize()); + EXPECT_EQ(testCase.mSize, metadata.GetSize()); + + const nsTArray& nativeSizes = metadata.GetNativeSizes(); + ASSERT_EQ(6, nativeSizes.Length()); + + IntSize expectedSizes[] = { + IntSize(16, 16), + IntSize(32, 32), + IntSize(64, 64), + IntSize(128, 128), + IntSize(256, 256), + IntSize(256, 128), + }; + + for (int i = 0; i < 6; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + + // Request decoding at native size + testCase.mOutputSize = nativeSizes[i]; + RunDecodeToSurface(testCase, buffer); + } +} diff --git a/image/test/gtest/TestDecoders.cpp b/image/test/gtest/TestDecoders.cpp index d39b8e404a60f..43fd36b0d1bf1 100644 --- a/image/test/gtest/TestDecoders.cpp +++ b/image/test/gtest/TestDecoders.cpp @@ -672,3 +672,87 @@ TEST_F(ImageDecoders, TruncatedSmallGIFSingleChunk) { CheckDecoderSingleChunk(TruncatedSmallGIFTestCase()); } + +TEST_F(ImageDecoders, MultipleSizesICOSingleChunk) +{ + ImageTestCase testCase = GreenMultipleSizesICOTestCase(); + + // Create an image. + RefPtr image = + ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); + ASSERT_TRUE(!image->HasError()); + + nsCOMPtr inputStream = LoadFile(testCase.mPath); + ASSERT_TRUE(inputStream); + + // Figure out how much data we have. + uint64_t length; + nsresult rv = inputStream->Available(&length); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + // Write the data into the image. + rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, + static_cast(length)); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + // Let the image know we've sent all the data. + rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + RefPtr tracker = image->GetProgressTracker(); + tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); + + // Use GetFrame() to force a sync decode of the image. + RefPtr surface = + image->GetFrame(imgIContainer::FRAME_CURRENT, + imgIContainer::FLAG_SYNC_DECODE); + + // Ensure that the image's metadata meets our expectations. + IntSize imageSize(0, 0); + rv = image->GetWidth(&imageSize.width); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + rv = image->GetHeight(&imageSize.height); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + + EXPECT_EQ(testCase.mSize.width, imageSize.width); + EXPECT_EQ(testCase.mSize.height, imageSize.height); + + nsTArray nativeSizes; + rv = image->GetNativeSizes(nativeSizes); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_EQ(6, nativeSizes.Length()); + + IntSize expectedSizes[] = { + IntSize(16, 16), + IntSize(32, 32), + IntSize(64, 64), + IntSize(128, 128), + IntSize(256, 256), + IntSize(256, 128) + }; + + for (int i = 0; i < 6; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + } + + RefPtr image90 = + ImageOps::Orient(image, Orientation(Angle::D90, Flip::Unflipped)); + rv = image90->GetNativeSizes(nativeSizes); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_EQ(6, nativeSizes.Length()); + + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + } + EXPECT_EQ(IntSize(128, 256), nativeSizes[5]); + + RefPtr image180 = + ImageOps::Orient(image, Orientation(Angle::D180, Flip::Unflipped)); + rv = image180->GetNativeSizes(nativeSizes); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_EQ(6, nativeSizes.Length()); + + for (int i = 0; i < 6; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + } +} diff --git a/image/test/gtest/green-multiple-sizes.ico b/image/test/gtest/green-multiple-sizes.ico new file mode 100644 index 0000000000000000000000000000000000000000..b9463d0c897117204b2edacfa6cbfc4f5f61d771 GIT binary patch literal 14144 zcmeI$u}Z^09LMorsuU?iGF5aj4uYeb;1s1*3sS3eaC9mnh?}dy&3ACb06tZ(!iOf<#;`kn$9d6k7uQwnw00` zaUxyT{R2m&RA=t*nr^D^Qz==H);#5cg;n_hP}ZY(wYf8)+x>!>Ikgv!B;X9iE3tM2N({eIg8WY>=`o{tYb zv)pNI^-teFUZdEfx8di(`TWMvmqon9E8ga6@%BCpJMC`kVf*AdR5C+V;zwm7l&;4? wWulUxM*sl?5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0;O_{00SHw$wg3PC literal 0 HcmV?d00001 diff --git a/image/test/gtest/moz.build b/image/test/gtest/moz.build index ad69e098518cd..3e37573dba045 100644 --- a/image/test/gtest/moz.build +++ b/image/test/gtest/moz.build @@ -47,6 +47,7 @@ TEST_HARNESS_FILES.gtest += [ 'first-frame-green.png', 'first-frame-padding.gif', 'green-1x1-truncated.gif', + 'green-multiple-sizes.ico', 'green.bmp', 'green.gif', 'green.ico', From c6474641afb93109b934a3a18c7ddeb38e912352 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Wed, 22 Mar 2017 09:19:05 -0400 Subject: [PATCH 250/300] Backed out changeset 0b797601dc36 (bug 1343499) for build bustages. r=backout --- image/DynamicImage.cpp | 6 -- image/DynamicImage.h | 1 - image/FrameTimeout.h | 119 ---------------------- image/ImageMetadata.h | 13 +-- image/ImageOps.cpp | 110 ++------------------ image/ImageOps.h | 61 +---------- image/ImageWrapper.cpp | 6 -- image/ImageWrapper.h | 1 - image/OrientedImage.cpp | 16 --- image/OrientedImage.h | 1 - image/RasterImage.cpp | 19 ---- image/RasterImage.h | 2 - image/VectorImage.cpp | 7 -- image/VectorImage.h | 1 - image/decoders/nsICODecoder.cpp | 2 - image/imgFrame.h | 101 +++++++++++++++++- image/imgIContainer.idl | 4 - image/moz.build | 2 - image/test/gtest/Common.cpp | 6 -- image/test/gtest/Common.h | 2 - image/test/gtest/TestDecodeToSurface.cpp | 84 ++------------- image/test/gtest/TestDecoders.cpp | 84 --------------- image/test/gtest/green-multiple-sizes.ico | Bin 14144 -> 0 bytes image/test/gtest/moz.build | 1 - 24 files changed, 119 insertions(+), 530 deletions(-) delete mode 100644 image/FrameTimeout.h delete mode 100644 image/test/gtest/green-multiple-sizes.ico diff --git a/image/DynamicImage.cpp b/image/DynamicImage.cpp index 47c920944c3ec..d6444066a9e92 100644 --- a/image/DynamicImage.cpp +++ b/image/DynamicImage.cpp @@ -127,12 +127,6 @@ DynamicImage::GetHeight(int32_t* aHeight) return NS_OK; } -nsresult -DynamicImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP DynamicImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/DynamicImage.h b/image/DynamicImage.h index 09c6ed550a257..a39a29b8e37ed 100644 --- a/image/DynamicImage.h +++ b/image/DynamicImage.h @@ -31,7 +31,6 @@ class DynamicImage : public Image } // Inherited methods from Image. - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t SizeOfSourceWithComputedFallback( MallocSizeOf aMallocSizeOf) const override; diff --git a/image/FrameTimeout.h b/image/FrameTimeout.h deleted file mode 100644 index 4070bba65b2b5..0000000000000 --- a/image/FrameTimeout.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_image_FrameTimeout_h -#define mozilla_image_FrameTimeout_h - -#include -#include "mozilla/Assertions.h" - -namespace mozilla { -namespace image { - -/** - * FrameTimeout wraps a frame timeout value (measured in milliseconds) after - * first normalizing it. This normalization is necessary because some tools - * generate incorrect frame timeout values which we nevertheless have to - * support. For this reason, code that deals with frame timeouts should always - * use a FrameTimeout value rather than the raw value from the image header. - */ -struct FrameTimeout -{ - /** - * @return a FrameTimeout of zero. This should be used only for math - * involving FrameTimeout values. You can't obtain a zero FrameTimeout from - * FromRawMilliseconds(). - */ - static FrameTimeout Zero() { return FrameTimeout(0); } - - /// @return an infinite FrameTimeout. - static FrameTimeout Forever() { return FrameTimeout(-1); } - - /// @return a FrameTimeout obtained by normalizing a raw timeout value. - static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) - { - // Normalize all infinite timeouts to the same value. - if (aRawMilliseconds < 0) { - return FrameTimeout::Forever(); - } - - // Very small timeout values are problematic for two reasons: we don't want - // to burn energy redrawing animated images extremely fast, and broken tools - // generate these values when they actually want a "default" value, so such - // images won't play back right without normalization. For some context, - // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical - // behavior of IE and Opera was: - // IE 6/Win: - // 10 - 50ms is normalized to 100ms. - // >50ms is used unnormalized. - // Opera 7 final/Win: - // 10ms is normalized to 100ms. - // >10ms is used unnormalized. - if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { - return FrameTimeout(100); - } - - // The provided timeout value is OK as-is. - return FrameTimeout(aRawMilliseconds); - } - - bool operator==(const FrameTimeout& aOther) const - { - return mTimeout == aOther.mTimeout; - } - - bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } - - FrameTimeout operator+(const FrameTimeout& aOther) - { - if (*this == Forever() || aOther == Forever()) { - return Forever(); - } - - return FrameTimeout(mTimeout + aOther.mTimeout); - } - - FrameTimeout& operator+=(const FrameTimeout& aOther) - { - *this = *this + aOther; - return *this; - } - - /** - * @return this FrameTimeout's value in milliseconds. Illegal to call on a - * an infinite FrameTimeout value. - */ - uint32_t AsMilliseconds() const - { - if (*this == Forever()) { - MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); - return 100; // Fail to something sane. - } - - return uint32_t(mTimeout); - } - - /** - * @return this FrameTimeout value encoded so that non-negative values - * represent a timeout in milliseconds, and -1 represents an infinite - * timeout. - * - * XXX(seth): This is a backwards compatibility hack that should be removed. - */ - int32_t AsEncodedValueDeprecated() const { return mTimeout; } - -private: - explicit FrameTimeout(int32_t aTimeout) - : mTimeout(aTimeout) - { } - - int32_t mTimeout; -}; - -} // namespace image -} // namespace mozilla - -#endif // mozilla_image_FrameTimeout_h diff --git a/image/ImageMetadata.h b/image/ImageMetadata.h index b1a2edfb03fde..05f5729802c71 100644 --- a/image/ImageMetadata.h +++ b/image/ImageMetadata.h @@ -11,11 +11,12 @@ #include "mozilla/Maybe.h" #include "nsSize.h" #include "Orientation.h" -#include "FrameTimeout.h" namespace mozilla { namespace image { +class RasterImage; + // The metadata about an image that decoders accumulate as they decode. class ImageMetadata { @@ -63,13 +64,6 @@ class ImageMetadata nsIntSize GetSize() const { return *mSize; } bool HasSize() const { return mSize.isSome(); } - void AddNativeSize(const nsIntSize& aSize) - { - mNativeSizes.AppendElement(aSize); - } - - const nsTArray& GetNativeSizes() const { return mNativeSizes; } - Orientation GetOrientation() const { return *mOrientation; } bool HasOrientation() const { return mOrientation.isSome(); } @@ -96,9 +90,6 @@ class ImageMetadata Maybe mSize; Maybe mOrientation; - // Sizes the image can natively decode to. - nsTArray mNativeSizes; - bool mHasAnimation : 1; }; diff --git a/image/ImageOps.cpp b/image/ImageOps.cpp index fb4fc8fb70751..d1d5da283642d 100644 --- a/image/ImageOps.cpp +++ b/image/ImageOps.cpp @@ -14,7 +14,6 @@ #include "FrozenImage.h" #include "IDecodingTask.h" #include "Image.h" -#include "ImageMetadata.h" #include "imgIContainer.h" #include "mozilla/gfx/2D.h" #include "nsStreamUtils.h" @@ -80,27 +79,10 @@ ImageOps::CreateFromDrawable(gfxDrawable* aDrawable) return drawableImage.forget(); } -class ImageOps::ImageBufferImpl final : public ImageOps::ImageBuffer { -public: - ImageBufferImpl(already_AddRefed aSourceBuffer) - : mSourceBuffer(aSourceBuffer) - { } - -protected: - ~ImageBufferImpl() override { } - - virtual already_AddRefed GetSourceBuffer() - { - RefPtr sourceBuffer = mSourceBuffer; - return sourceBuffer.forget(); - } - -private: - RefPtr mSourceBuffer; -}; - -/* static */ already_AddRefed -ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) +/* static */ already_AddRefed +ImageOps::DecodeToSurface(nsIInputStream* aInputStream, + const nsACString& aMimeType, + uint32_t aFlags) { MOZ_ASSERT(aInputStream); @@ -125,7 +107,7 @@ ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) } // Write the data into a SourceBuffer. - RefPtr sourceBuffer = new SourceBuffer(); + NotNull> sourceBuffer = WrapNotNull(new SourceBuffer()); sourceBuffer->ExpectLength(length); rv = sourceBuffer->AppendFromInputStream(inputStream, length); if (NS_FAILED(rv)) { @@ -140,90 +122,12 @@ ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) } sourceBuffer->Complete(NS_OK); - RefPtr imageBuffer = new ImageBufferImpl(sourceBuffer.forget()); - return imageBuffer.forget(); -} - -/* static */ nsresult -ImageOps::DecodeMetadata(nsIInputStream* aInputStream, - const nsACString& aMimeType, - ImageMetadata& aMetadata) -{ - RefPtr buffer = CreateImageBuffer(aInputStream); - return DecodeMetadata(buffer, aMimeType, aMetadata); -} - -/* static */ nsresult -ImageOps::DecodeMetadata(ImageBuffer* aBuffer, - const nsACString& aMimeType, - ImageMetadata& aMetadata) -{ - if (!aBuffer) { - return NS_ERROR_FAILURE; - } - - RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); - if (NS_WARN_IF(!sourceBuffer)) { - return NS_ERROR_FAILURE; - } - - // Create a decoder. - DecoderType decoderType = - DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); - RefPtr decoder = - DecoderFactory::CreateAnonymousMetadataDecoder(decoderType, - WrapNotNull(sourceBuffer)); - if (!decoder) { - return NS_ERROR_FAILURE; - } - - // Run the decoder synchronously. - RefPtr task = new AnonymousDecodingTask(WrapNotNull(decoder)); - task->Run(); - if (!decoder->GetDecodeDone() || decoder->HasError()) { - return NS_ERROR_FAILURE; - } - - aMetadata = decoder->GetImageMetadata(); - if (aMetadata.GetNativeSizes().IsEmpty() && aMetadata.HasSize()) { - aMetadata.AddNativeSize(aMetadata.GetSize()); - } - - return NS_OK; -} - -/* static */ already_AddRefed -ImageOps::DecodeToSurface(nsIInputStream* aInputStream, - const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize /* = Nothing() */) -{ - RefPtr buffer = CreateImageBuffer(aInputStream); - return DecodeToSurface(buffer, aMimeType, aFlags, aSize); -} - -/* static */ already_AddRefed -ImageOps::DecodeToSurface(ImageBuffer* aBuffer, - const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize /* = Nothing() */) -{ - if (!aBuffer) { - return nullptr; - } - - RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); - if (NS_WARN_IF(!sourceBuffer)) { - return nullptr; - } - // Create a decoder. DecoderType decoderType = DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); RefPtr decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, - WrapNotNull(sourceBuffer), - aSize, ToSurfaceFlags(aFlags)); + DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, + Nothing(), ToSurfaceFlags(aFlags)); if (!decoder) { return nullptr; } diff --git a/image/ImageOps.h b/image/ImageOps.h index 5a089fd16b030..7a8e19be34410 100644 --- a/image/ImageOps.h +++ b/image/ImageOps.h @@ -9,7 +9,6 @@ #include "nsCOMPtr.h" #include "nsRect.h" -#include "ImageMetadata.h" class gfxDrawable; class imgIContainer; @@ -25,23 +24,10 @@ namespace image { class Image; struct Orientation; -class SourceBuffer; class ImageOps { public: - class ImageBuffer { - public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageOps::ImageBuffer); - protected: - friend class ImageOps; - - ImageBuffer() { } - virtual ~ImageBuffer() { } - - virtual already_AddRefed GetSourceBuffer() = 0; - }; - /** * Creates a version of an existing image which does not animate and is frozen * at the first frame. @@ -88,39 +74,6 @@ class ImageOps static already_AddRefed CreateFromDrawable(gfxDrawable* aDrawable); - /** - * Create a buffer to be used with DecodeMetadata and DecodeToSurface. Reusing - * an ImageBuffer representing the given input stream is more efficient if one - * has multiple Decode* calls to make on that stream. - * - * @param aInputStream An input stream containing an encoded image. - * @return An image buffer derived from the input stream. - */ - static already_AddRefed - CreateImageBuffer(nsIInputStream* aInputStream); - - /** - * Decodes an image's metadata from an nsIInputStream into the given - * structure. This function may be called off-main-thread. - * - * @param aInputStream An input stream containing an encoded image. - * @param aMimeType The MIME type of the image. - * @param aMetadata Where the image metadata is stored upon success. - * @return The status of the operation. - */ - static nsresult - DecodeMetadata(nsIInputStream* aInputStream, - const nsACString& aMimeType, - ImageMetadata& aMetadata); - - /** - * Same as above but takes an ImageBuffer instead of nsIInputStream. - */ - static nsresult - DecodeMetadata(ImageBuffer* aBuffer, - const nsACString& aMimeType, - ImageMetadata& aMetadata); - /** * Decodes an image from an nsIInputStream directly into a SourceSurface, * without ever creating an Image or imgIContainer (which are mostly @@ -136,21 +89,9 @@ class ImageOps static already_AddRefed DecodeToSurface(nsIInputStream* aInputStream, const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize = Nothing()); - - /** - * Same as above but takes an ImageBuffer instead of nsIInputStream. - */ - static already_AddRefed - DecodeToSurface(ImageBuffer* aBuffer, - const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize = Nothing()); + uint32_t aFlags); private: - class ImageBufferImpl; - // This is a static utility class, so disallow instantiation. virtual ~ImageOps() = 0; }; diff --git a/image/ImageWrapper.cpp b/image/ImageWrapper.cpp index 8524799045679..dfc76641fd6f4 100644 --- a/image/ImageWrapper.cpp +++ b/image/ImageWrapper.cpp @@ -139,12 +139,6 @@ ImageWrapper::GetHeight(int32_t* aHeight) return mInnerImage->GetHeight(aHeight); } -nsresult -ImageWrapper::GetNativeSizes(nsTArray& aNativeSizes) const -{ - return mInnerImage->GetNativeSizes(aNativeSizes); -} - NS_IMETHODIMP ImageWrapper::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/ImageWrapper.h b/image/ImageWrapper.h index 19e9cb8582329..94cf0948b537c 100644 --- a/image/ImageWrapper.h +++ b/image/ImageWrapper.h @@ -22,7 +22,6 @@ class ImageWrapper : public Image NS_DECL_IMGICONTAINER // Inherited methods from Image. - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t diff --git a/image/OrientedImage.cpp b/image/OrientedImage.cpp index 79767e2a796ab..951b0acbc94d1 100644 --- a/image/OrientedImage.cpp +++ b/image/OrientedImage.cpp @@ -46,22 +46,6 @@ OrientedImage::GetHeight(int32_t* aHeight) } } -nsresult -OrientedImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - nsresult rv = InnerImage()->GetNativeSizes(aNativeSizes); - - if (mOrientation.SwapsWidthAndHeight()) { - auto i = aNativeSizes.Length(); - while (i > 0) { - --i; - swap(aNativeSizes[i].width, aNativeSizes[i].height); - } - } - - return rv; -} - NS_IMETHODIMP OrientedImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/OrientedImage.h b/image/OrientedImage.h index d1291ea74b20a..2edf05de9f50c 100644 --- a/image/OrientedImage.h +++ b/image/OrientedImage.h @@ -30,7 +30,6 @@ class OrientedImage : public ImageWrapper NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override; NS_IMETHOD_(already_AddRefed) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index b3da4ff3697e6..b987448502951 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -220,24 +220,6 @@ RasterImage::GetHeight(int32_t* aHeight) return NS_OK; } -//****************************************************************************** -nsresult -RasterImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - if (mError) { - return NS_ERROR_FAILURE; - } - - if (mNativeSizes.IsEmpty()) { - aNativeSizes.Clear(); - aNativeSizes.AppendElement(mSize); - } else { - aNativeSizes = mNativeSizes; - } - - return NS_OK; -} - //****************************************************************************** NS_IMETHODIMP RasterImage::GetIntrinsicSize(nsSize* aSize) @@ -721,7 +703,6 @@ RasterImage::SetMetadata(const ImageMetadata& aMetadata, // Set the size and flag that we have it. mSize = size; mOrientation = orientation; - mNativeSizes = aMetadata.GetNativeSizes(); mHasSize = true; } diff --git a/image/RasterImage.h b/image/RasterImage.h index 023985669a7a7..09fa18b4df655 100644 --- a/image/RasterImage.h +++ b/image/RasterImage.h @@ -160,7 +160,6 @@ class RasterImage final : public ImageResource NS_DECL_IMGICONTAINERDEBUG #endif - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual nsresult StartAnimation() override; virtual nsresult StopAnimation() override; @@ -381,7 +380,6 @@ class RasterImage final : public ImageResource private: // data nsIntSize mSize; - nsTArray mNativeSizes; Orientation mOrientation; /// If this has a value, we're waiting for SetSize() to send the load event. diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index 7c650fc7545ca..fa3ecb8bc049a 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -520,13 +520,6 @@ VectorImage::GetWidth(int32_t* aWidth) return NS_OK; } -//****************************************************************************** -nsresult -VectorImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - //****************************************************************************** NS_IMETHODIMP_(void) VectorImage::RequestRefresh(const TimeStamp& aTime) diff --git a/image/VectorImage.h b/image/VectorImage.h index a05c92f3cf380..cb55e057753cd 100644 --- a/image/VectorImage.h +++ b/image/VectorImage.h @@ -34,7 +34,6 @@ class VectorImage final : public ImageResource, // (no public constructor - use ImageFactory) // Methods inherited from Image - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual size_t SizeOfSourceWithComputedFallback(MallocSizeOf aMallocSizeOf) const override; virtual void CollectSizeOfSurfaces(nsTArray& aCounters, diff --git a/image/decoders/nsICODecoder.cpp b/image/decoders/nsICODecoder.cpp index d8171431ea837..85b3c139b0d78 100644 --- a/image/decoders/nsICODecoder.cpp +++ b/image/decoders/nsICODecoder.cpp @@ -242,8 +242,6 @@ nsICODecoder::ReadDirEntry(const char* aData) } } - mImageMetadata.AddNativeSize(entrySize); - if (desiredSize) { // Calculate the delta between this resource's size and the desired size, so // we can see if it is better than our current-best option. In the case of diff --git a/image/imgFrame.h b/image/imgFrame.h index bd858e088dcff..77ff3507b1771 100644 --- a/image/imgFrame.h +++ b/image/imgFrame.h @@ -11,7 +11,6 @@ #include "mozilla/MemoryReporting.h" #include "mozilla/Monitor.h" #include "mozilla/Move.h" -#include "FrameTimeout.h" #include "gfxDrawable.h" #include "imgIContainer.h" #include "MainThreadUtils.h" @@ -47,6 +46,106 @@ enum class Opacity : uint8_t { SOME_TRANSPARENCY }; +/** + * FrameTimeout wraps a frame timeout value (measured in milliseconds) after + * first normalizing it. This normalization is necessary because some tools + * generate incorrect frame timeout values which we nevertheless have to + * support. For this reason, code that deals with frame timeouts should always + * use a FrameTimeout value rather than the raw value from the image header. + */ +struct FrameTimeout +{ + /** + * @return a FrameTimeout of zero. This should be used only for math + * involving FrameTimeout values. You can't obtain a zero FrameTimeout from + * FromRawMilliseconds(). + */ + static FrameTimeout Zero() { return FrameTimeout(0); } + + /// @return an infinite FrameTimeout. + static FrameTimeout Forever() { return FrameTimeout(-1); } + + /// @return a FrameTimeout obtained by normalizing a raw timeout value. + static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) + { + // Normalize all infinite timeouts to the same value. + if (aRawMilliseconds < 0) { + return FrameTimeout::Forever(); + } + + // Very small timeout values are problematic for two reasons: we don't want + // to burn energy redrawing animated images extremely fast, and broken tools + // generate these values when they actually want a "default" value, so such + // images won't play back right without normalization. For some context, + // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical + // behavior of IE and Opera was: + // IE 6/Win: + // 10 - 50ms is normalized to 100ms. + // >50ms is used unnormalized. + // Opera 7 final/Win: + // 10ms is normalized to 100ms. + // >10ms is used unnormalized. + if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { + return FrameTimeout(100); + } + + // The provided timeout value is OK as-is. + return FrameTimeout(aRawMilliseconds); + } + + bool operator==(const FrameTimeout& aOther) const + { + return mTimeout == aOther.mTimeout; + } + + bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } + + FrameTimeout operator+(const FrameTimeout& aOther) + { + if (*this == Forever() || aOther == Forever()) { + return Forever(); + } + + return FrameTimeout(mTimeout + aOther.mTimeout); + } + + FrameTimeout& operator+=(const FrameTimeout& aOther) + { + *this = *this + aOther; + return *this; + } + + /** + * @return this FrameTimeout's value in milliseconds. Illegal to call on a + * an infinite FrameTimeout value. + */ + uint32_t AsMilliseconds() const + { + if (*this == Forever()) { + MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); + return 100; // Fail to something sane. + } + + return uint32_t(mTimeout); + } + + /** + * @return this FrameTimeout value encoded so that non-negative values + * represent a timeout in milliseconds, and -1 represents an infinite + * timeout. + * + * XXX(seth): This is a backwards compatibility hack that should be removed. + */ + int32_t AsEncodedValueDeprecated() const { return mTimeout; } + +private: + explicit FrameTimeout(int32_t aTimeout) + : mTimeout(aTimeout) + { } + + int32_t mTimeout; +}; + /** * AnimationData contains all of the information necessary for using an imgFrame * as part of an animation. diff --git a/image/imgIContainer.idl b/image/imgIContainer.idl index eed28e2668d96..640eae3525587 100644 --- a/image/imgIContainer.idl +++ b/image/imgIContainer.idl @@ -90,10 +90,6 @@ interface imgIContainer : nsISupports */ readonly attribute int32_t height; - %{C++ - virtual nsresult GetNativeSizes(nsTArray& aNativeSizes) const = 0; - %} - /** * The intrinsic size of this image in appunits. If the image has no intrinsic * size in a dimension, -1 will be returned for that dimension. In the case of diff --git a/image/moz.build b/image/moz.build index 8ccb30247e91d..c3a3a610fd8e9 100644 --- a/image/moz.build +++ b/image/moz.build @@ -37,10 +37,8 @@ XPIDL_MODULE = 'imglib2' EXPORTS += [ 'DrawResult.h', - 'FrameTimeout.h', 'ImageCacheKey.h', 'ImageLogging.h', - 'ImageMetadata.h', 'ImageOps.h', 'ImageRegion.h', 'imgLoader.h', diff --git a/image/test/gtest/Common.cpp b/image/test/gtest/Common.cpp index 4bc7fce1c32e3..4be34461c71ca 100644 --- a/image/test/gtest/Common.cpp +++ b/image/test/gtest/Common.cpp @@ -679,11 +679,5 @@ ImageTestCase TruncatedSmallGIFTestCase() return ImageTestCase("green-1x1-truncated.gif", "image/gif", IntSize(1, 1)); } -ImageTestCase GreenMultipleSizesICOTestCase() -{ - return ImageTestCase("green-multiple-sizes.ico", "image/x-icon", - IntSize(256, 256)); -} - } // namespace image } // namespace mozilla diff --git a/image/test/gtest/Common.h b/image/test/gtest/Common.h index 63b8b9b700262..33fc26e750f82 100644 --- a/image/test/gtest/Common.h +++ b/image/test/gtest/Common.h @@ -414,8 +414,6 @@ ImageTestCase DownscaledTransparentICOWithANDMaskTestCase(); ImageTestCase TruncatedSmallGIFTestCase(); -ImageTestCase GreenMultipleSizesICOTestCase(); - } // namespace image } // namespace mozilla diff --git a/image/test/gtest/TestDecodeToSurface.cpp b/image/test/gtest/TestDecodeToSurface.cpp index b4b011528d97f..dd22d4308d9b1 100644 --- a/image/test/gtest/TestDecodeToSurface.cpp +++ b/image/test/gtest/TestDecodeToSurface.cpp @@ -27,11 +27,9 @@ class DecodeToSurfaceRunnable : public Runnable public: DecodeToSurfaceRunnable(RefPtr& aSurface, nsIInputStream* aInputStream, - ImageOps::ImageBuffer* aImageBuffer, const ImageTestCase& aTestCase) : mSurface(aSurface) , mInputStream(aInputStream) - , mImageBuffer(aImageBuffer) , mTestCase(aTestCase) { } @@ -43,35 +41,16 @@ class DecodeToSurfaceRunnable : public Runnable void Go() { - Maybe outputSize; - if (mTestCase.mOutputSize != mTestCase.mSize) { - outputSize.emplace(mTestCase.mOutputSize); - } - - if (mImageBuffer) { - mSurface = - ImageOps::DecodeToSurface(mImageBuffer, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT, - outputSize); - } else { - mSurface = - ImageOps::DecodeToSurface(mInputStream, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT, - outputSize); - } + mSurface = + ImageOps::DecodeToSurface(mInputStream, + nsDependentCString(mTestCase.mMimeType), + imgIContainer::DECODE_FLAGS_DEFAULT); ASSERT_TRUE(mSurface != nullptr); EXPECT_TRUE(mSurface->IsDataSourceSurface()); EXPECT_TRUE(mSurface->GetFormat() == SurfaceFormat::B8G8R8X8 || mSurface->GetFormat() == SurfaceFormat::B8G8R8A8); - - if (outputSize) { - EXPECT_EQ(*outputSize, mSurface->GetSize()); - } else { - EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); - } + EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); EXPECT_TRUE(IsSolidColor(mSurface, BGRAColor::Green(), mTestCase.mFlags & TEST_CASE_IS_FUZZY ? 1 : 0)); @@ -80,19 +59,14 @@ class DecodeToSurfaceRunnable : public Runnable private: RefPtr& mSurface; nsCOMPtr mInputStream; - RefPtr mImageBuffer; ImageTestCase mTestCase; }; static void -RunDecodeToSurface(const ImageTestCase& aTestCase, - ImageOps::ImageBuffer* aImageBuffer = nullptr) +RunDecodeToSurface(const ImageTestCase& aTestCase) { - nsCOMPtr inputStream; - if (!aImageBuffer) { - inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - } + nsCOMPtr inputStream = LoadFile(aTestCase.mPath); + ASSERT_TRUE(inputStream != nullptr); nsCOMPtr thread; nsresult rv = @@ -103,7 +77,7 @@ RunDecodeToSurface(const ImageTestCase& aTestCase, // DecodeToSurface doesn't require any main-thread-only code. RefPtr surface; nsCOMPtr runnable = - new DecodeToSurfaceRunnable(surface, inputStream, aImageBuffer, aTestCase); + new DecodeToSurfaceRunnable(surface, inputStream, aTestCase); thread->Dispatch(runnable, nsIThread::DISPATCH_SYNC); thread->Shutdown(); @@ -148,43 +122,3 @@ TEST_F(ImageDecodeToSurface, Corrupt) imgIContainer::DECODE_FLAGS_DEFAULT); EXPECT_TRUE(surface == nullptr); } - -TEST_F(ImageDecodeToSurface, ICOMultipleSizes) -{ - ImageTestCase testCase = GreenMultipleSizesICOTestCase(); - - nsCOMPtr inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - RefPtr buffer = - ImageOps::CreateImageBuffer(inputStream); - ASSERT_TRUE(buffer != nullptr); - - ImageMetadata metadata; - nsresult rv = ImageOps::DecodeMetadata(buffer, - nsDependentCString(testCase.mMimeType), - metadata); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_TRUE(metadata.HasSize()); - EXPECT_EQ(testCase.mSize, metadata.GetSize()); - - const nsTArray& nativeSizes = metadata.GetNativeSizes(); - ASSERT_EQ(6, nativeSizes.Length()); - - IntSize expectedSizes[] = { - IntSize(16, 16), - IntSize(32, 32), - IntSize(64, 64), - IntSize(128, 128), - IntSize(256, 256), - IntSize(256, 128), - }; - - for (int i = 0; i < 6; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - - // Request decoding at native size - testCase.mOutputSize = nativeSizes[i]; - RunDecodeToSurface(testCase, buffer); - } -} diff --git a/image/test/gtest/TestDecoders.cpp b/image/test/gtest/TestDecoders.cpp index 43fd36b0d1bf1..d39b8e404a60f 100644 --- a/image/test/gtest/TestDecoders.cpp +++ b/image/test/gtest/TestDecoders.cpp @@ -672,87 +672,3 @@ TEST_F(ImageDecoders, TruncatedSmallGIFSingleChunk) { CheckDecoderSingleChunk(TruncatedSmallGIFTestCase()); } - -TEST_F(ImageDecoders, MultipleSizesICOSingleChunk) -{ - ImageTestCase testCase = GreenMultipleSizesICOTestCase(); - - // Create an image. - RefPtr image = - ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); - ASSERT_TRUE(!image->HasError()); - - nsCOMPtr inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into the image. - rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, - static_cast(length)); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Let the image know we've sent all the data. - rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - RefPtr tracker = image->GetProgressTracker(); - tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); - - // Use GetFrame() to force a sync decode of the image. - RefPtr surface = - image->GetFrame(imgIContainer::FRAME_CURRENT, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that the image's metadata meets our expectations. - IntSize imageSize(0, 0); - rv = image->GetWidth(&imageSize.width); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - rv = image->GetHeight(&imageSize.height); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - EXPECT_EQ(testCase.mSize.width, imageSize.width); - EXPECT_EQ(testCase.mSize.height, imageSize.height); - - nsTArray nativeSizes; - rv = image->GetNativeSizes(nativeSizes); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_EQ(6, nativeSizes.Length()); - - IntSize expectedSizes[] = { - IntSize(16, 16), - IntSize(32, 32), - IntSize(64, 64), - IntSize(128, 128), - IntSize(256, 256), - IntSize(256, 128) - }; - - for (int i = 0; i < 6; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - } - - RefPtr image90 = - ImageOps::Orient(image, Orientation(Angle::D90, Flip::Unflipped)); - rv = image90->GetNativeSizes(nativeSizes); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_EQ(6, nativeSizes.Length()); - - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - } - EXPECT_EQ(IntSize(128, 256), nativeSizes[5]); - - RefPtr image180 = - ImageOps::Orient(image, Orientation(Angle::D180, Flip::Unflipped)); - rv = image180->GetNativeSizes(nativeSizes); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_EQ(6, nativeSizes.Length()); - - for (int i = 0; i < 6; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - } -} diff --git a/image/test/gtest/green-multiple-sizes.ico b/image/test/gtest/green-multiple-sizes.ico deleted file mode 100644 index b9463d0c897117204b2edacfa6cbfc4f5f61d771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14144 zcmeI$u}Z^09LMorsuU?iGF5aj4uYeb;1s1*3sS3eaC9mnh?}dy&3ACb06tZ(!iOf<#;`kn$9d6k7uQwnw00` zaUxyT{R2m&RA=t*nr^D^Qz==H);#5cg;n_hP}ZY(wYf8)+x>!>Ikgv!B;X9iE3tM2N({eIg8WY>=`o{tYb zv)pNI^-teFUZdEfx8di(`TWMvmqon9E8ga6@%BCpJMC`kVf*AdR5C+V;zwm7l&;4? wWulUxM*sl?5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0;O_{00SHw$wg3PC diff --git a/image/test/gtest/moz.build b/image/test/gtest/moz.build index 3e37573dba045..ad69e098518cd 100644 --- a/image/test/gtest/moz.build +++ b/image/test/gtest/moz.build @@ -47,7 +47,6 @@ TEST_HARNESS_FILES.gtest += [ 'first-frame-green.png', 'first-frame-padding.gif', 'green-1x1-truncated.gif', - 'green-multiple-sizes.ico', 'green.bmp', 'green.gif', 'green.ico', From 8a38359e89e866420f26297add95241e5dd66f76 Mon Sep 17 00:00:00 2001 From: "Nicolas B. Pierron" Date: Wed, 22 Mar 2017 13:42:26 +0000 Subject: [PATCH 251/300] Bug 1331662 part 1 - Reimplement EvaluateString using the ExecutionContext class. r=bz --- dom/base/nsJSUtils.cpp | 251 ++++++++++++++++++++++++++++------------- dom/base/nsJSUtils.h | 90 +++++++++++++++ 2 files changed, 262 insertions(+), 79 deletions(-) diff --git a/dom/base/nsJSUtils.cpp b/dom/base/nsJSUtils.cpp index 98b367b663a4f..5c8802487b851 100644 --- a/dom/base/nsJSUtils.cpp +++ b/dom/base/nsJSUtils.cpp @@ -123,6 +123,164 @@ nsJSUtils::CompileFunction(AutoJSAPI& jsapi, return NS_OK; } +static nsresult +EvaluationExceptionToNSResult(JSContext* aCx) +{ + if (JS_IsExceptionPending(aCx)) { + return NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW; + } + return NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE; +} + +nsJSUtils::ExecutionContext::ExecutionContext(JSContext* aCx, + JS::Handle aGlobal) + : mSamplerRAII("nsJSUtils::ExecutionContext", /* PROFILER_LABEL */ + js::ProfileEntry::Category::JS, __LINE__) + , mCx(aCx) + , mCompartment(aCx, aGlobal) + , mRetValue(aCx) + , mScopeChain(aCx) + , mRv(NS_OK) + , mSkip(false) + , mCoerceToString(false) +#ifdef DEBUG + , mWantsReturnValue(false) + , mExpectScopeChain(false) +#endif +{ + MOZ_ASSERT(aCx == nsContentUtils::GetCurrentJSContext()); + MOZ_ASSERT(NS_IsMainThread()); + MOZ_ASSERT(nsContentUtils::IsInMicroTask()); + MOZ_ASSERT(mRetValue.isUndefined()); + + MOZ_ASSERT(js::GetGlobalForObjectCrossCompartment(aGlobal) == aGlobal); + if (MOZ_UNLIKELY(!xpc::Scriptability::Get(aGlobal).Allowed())) { + mSkip = true; + mRv = NS_OK; + } +} + +void +nsJSUtils::ExecutionContext::SetScopeChain( + const JS::AutoObjectVector& aScopeChain) +{ + if (mSkip) { + return; + } + +#ifdef DEBUG + mExpectScopeChain = true; +#endif + // Now make sure to wrap the scope chain into the right compartment. + if (!mScopeChain.reserve(aScopeChain.length())) { + mSkip = true; + mRv = NS_ERROR_OUT_OF_MEMORY; + return; + } + + for (size_t i = 0; i < aScopeChain.length(); ++i) { + JS::ExposeObjectToActiveJS(aScopeChain[i]); + mScopeChain.infallibleAppend(aScopeChain[i]); + if (!JS_WrapObject(mCx, mScopeChain[i])) { + mSkip = true; + mRv = NS_ERROR_OUT_OF_MEMORY; + return; + } + } +} + +nsresult +nsJSUtils::ExecutionContext::SyncAndExec(void **aOffThreadToken, + JS::MutableHandle aScript) +{ + if (mSkip) { + return mRv; + } + + MOZ_ASSERT(!mWantsReturnValue); + MOZ_ASSERT(!mExpectScopeChain); + aScript.set(JS::FinishOffThreadScript(mCx, *aOffThreadToken)); + *aOffThreadToken = nullptr; // Mark the token as having been finished. + if (!aScript || !JS_ExecuteScript(mCx, mScopeChain, aScript)) { + mSkip = true; + mRv = EvaluationExceptionToNSResult(mCx); + return mRv; + } + + return NS_OK; +} + +nsresult +nsJSUtils::ExecutionContext::CompileAndExec(JS::CompileOptions& aCompileOptions, + JS::SourceBufferHolder& aSrcBuf) +{ + if (mSkip) { + return mRv; + } + + MOZ_ASSERT_IF(aCompileOptions.versionSet, + aCompileOptions.version != JSVERSION_UNKNOWN); + MOZ_ASSERT(aSrcBuf.get()); + MOZ_ASSERT(mRetValue.isUndefined()); +#ifdef DEBUG + mWantsReturnValue = !aCompileOptions.noScriptRval; +#endif + MOZ_ASSERT(!mCoerceToString || mWantsReturnValue); + if (!JS::Evaluate(mCx, mScopeChain, aCompileOptions, aSrcBuf, &mRetValue)) { + mSkip = true; + mRv = EvaluationExceptionToNSResult(mCx); + return mRv; + } + + return NS_OK; +} + +nsresult +nsJSUtils::ExecutionContext::CompileAndExec(JS::CompileOptions& aCompileOptions, + const nsAString& aScript) +{ + if (mSkip) { + return mRv; + } + + const nsPromiseFlatString& flatScript = PromiseFlatString(aScript); + JS::SourceBufferHolder srcBuf(flatScript.get(), aScript.Length(), + JS::SourceBufferHolder::NoOwnership); + return CompileAndExec(aCompileOptions, srcBuf); +} + +nsresult +nsJSUtils::ExecutionContext::ExtractReturnValue(JS::MutableHandle aRetValue) +{ + MOZ_ASSERT(aRetValue.isUndefined()); + if (mSkip) { + // Repeat earlier result, as NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW are not + // failures cases. +#ifdef DEBUG + mWantsReturnValue = false; +#endif + return mRv; + } + + MOZ_ASSERT(mWantsReturnValue); +#ifdef DEBUG + mWantsReturnValue = false; +#endif + if (mCoerceToString && !mRetValue.isUndefined()) { + JSString* str = JS::ToString(mCx, mRetValue); + if (!str) { + // ToString can be a function call, so an exception can be raised while + // executing the function. + mSkip = true; + return EvaluationExceptionToNSResult(mCx); + } + mRetValue.set(JS::StringValue(str)); + } + + aRetValue.set(mRetValue); + return NS_OK; +} + nsresult nsJSUtils::EvaluateString(JSContext* aCx, const nsAString& aScript, @@ -147,92 +305,27 @@ nsJSUtils::EvaluateString(JSContext* aCx, JS::MutableHandle aRetValue, void **aOffThreadToken) { - PROFILER_LABEL("nsJSUtils", "EvaluateString", - js::ProfileEntry::Category::JS); - - MOZ_ASSERT_IF(aCompileOptions.versionSet, - aCompileOptions.version != JSVERSION_UNKNOWN); - MOZ_ASSERT_IF(aEvaluateOptions.coerceToString, !aCompileOptions.noScriptRval); - MOZ_ASSERT(aCx == nsContentUtils::GetCurrentJSContext()); - MOZ_ASSERT(aSrcBuf.get()); - MOZ_ASSERT(js::GetGlobalForObjectCrossCompartment(aEvaluationGlobal) == - aEvaluationGlobal); - MOZ_ASSERT_IF(aOffThreadToken, aCompileOptions.noScriptRval); - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(nsContentUtils::IsInMicroTask()); - - // Unfortunately, the JS engine actually compiles scripts with a return value - // in a different, less efficient way. Furthermore, it can't JIT them in many - // cases. So we need to be explicitly told whether the caller cares about the - // return value. Callers can do this by calling the other overload of - // EvaluateString() which calls this function with - // aCompileOptions.noScriptRval set to true. - aRetValue.setUndefined(); + ExecutionContext exec(aCx, aEvaluationGlobal); + exec.SetReturnValue(aCompileOptions) + .SetCoerceToString(aEvaluateOptions.coerceToString); + exec.SetScopeChain(aEvaluateOptions.scopeChain); nsresult rv = NS_OK; - - NS_ENSURE_TRUE(xpc::Scriptability::Get(aEvaluationGlobal).Allowed(), NS_OK); - - bool ok = true; - // Scope the JSAutoCompartment so that we can later wrap the return value - // into the caller's cx. - { - JSAutoCompartment ac(aCx, aEvaluationGlobal); - - // Now make sure to wrap the scope chain into the right compartment. - JS::AutoObjectVector scopeChain(aCx); - if (!scopeChain.reserve(aEvaluateOptions.scopeChain.length())) { - return NS_ERROR_OUT_OF_MEMORY; - } - - for (size_t i = 0; i < aEvaluateOptions.scopeChain.length(); ++i) { - JS::ExposeObjectToActiveJS(aEvaluateOptions.scopeChain[i]); - scopeChain.infallibleAppend(aEvaluateOptions.scopeChain[i]); - if (!JS_WrapObject(aCx, scopeChain[i])) { - ok = false; - break; - } - } - - if (ok && aOffThreadToken) { - JS::Rooted - script(aCx, JS::FinishOffThreadScript(aCx, *aOffThreadToken)); - *aOffThreadToken = nullptr; // Mark the token as having been finished. - if (script) { - ok = JS_ExecuteScript(aCx, scopeChain, script); - } else { - ok = false; - } - } else if (ok) { - ok = JS::Evaluate(aCx, scopeChain, aCompileOptions, aSrcBuf, aRetValue); - } - - if (ok && aEvaluateOptions.coerceToString && !aRetValue.isUndefined()) { - JS::Rooted value(aCx, aRetValue); - JSString* str = JS::ToString(aCx, value); - ok = !!str; - aRetValue.set(ok ? JS::StringValue(str) : JS::UndefinedValue()); - } + if (aOffThreadToken) { + JS::Rooted script(aCx); + rv = exec.SyncAndExec(aOffThreadToken, &script); + } else { + rv = exec.CompileAndExec(aCompileOptions, aSrcBuf); } - if (!ok) { - if (JS_IsExceptionPending(aCx)) { - rv = NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW; - } else { - rv = NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE; - } - - if (!aCompileOptions.noScriptRval) { - aRetValue.setUndefined(); - } + if (NS_FAILED(rv)) { + return rv; } - // Wrap the return value into whatever compartment aCx was in. - if (ok && !aCompileOptions.noScriptRval) { - if (!JS_WrapValue(aCx, aRetValue)) { - return NS_ERROR_OUT_OF_MEMORY; - } + if (!aCompileOptions.noScriptRval) { + return exec.ExtractReturnValue(aRetValue); } + return rv; } diff --git a/dom/base/nsJSUtils.h b/dom/base/nsJSUtils.h index 4affab2d36447..71c313a714162 100644 --- a/dom/base/nsJSUtils.h +++ b/dom/base/nsJSUtils.h @@ -16,6 +16,7 @@ #include "mozilla/Assertions.h" +#include "GeckoProfiler.h" #include "jsapi.h" #include "jsfriendapi.h" #include "js/Conversions.h" @@ -64,6 +65,95 @@ class nsJSUtils const nsAString& aBody, JSObject** aFunctionObject); + + // ExecutionContext is used to switch compartment. + class MOZ_STACK_CLASS ExecutionContext { + // Register stack annotations for the Gecko profiler. + mozilla::SamplerStackFrameRAII mSamplerRAII; + + JSContext* mCx; + + // Handles switching to our global's compartment. + JSAutoCompartment mCompartment; + + // Set to a valid handle if a return value is expected. + JS::Rooted mRetValue; + + // Scope chain in which the execution takes place. + JS::AutoObjectVector mScopeChain; + + // returned value forwarded when we have to interupt the execution eagerly + // with mSkip. + nsresult mRv; + + // Used to skip upcoming phases in case of a failure. In such case the + // result is carried by mRv. + bool mSkip; + + // Should the result be serialized before being returned. + bool mCoerceToString; + +#ifdef DEBUG + // Should we set the return value. + bool mWantsReturnValue; + + bool mExpectScopeChain; +#endif + + public: + + // Enter compartment in which the code would be executed. The JSContext + // must come from an AutoEntryScript that has had + // TakeOwnershipOfErrorReporting() called on it. + ExecutionContext(JSContext* aCx, JS::Handle aGlobal); + + ExecutionContext(const ExecutionContext&) = delete; + ExecutionContext(ExecutionContext&&) = delete; + + ~ExecutionContext() { + // This flag is resetted, when the returned value is extracted. + MOZ_ASSERT(!mWantsReturnValue); + } + + // The returned value would be converted to a string if the + // |aCoerceToString| is flag set. + ExecutionContext& SetCoerceToString(bool aCoerceToString) { + mCoerceToString = aCoerceToString; + return *this; + } + + // Set the scope chain in which the code should be executed. + void SetScopeChain(const JS::AutoObjectVector& aScopeChain); + + // Copy the returned value in the mutable handle argument, in case of a + // evaluation failure either during the execution or the conversion of the + // result to a string, the nsresult would be set to the corresponding result + // code, and the mutable handle argument would remain unchanged. + // + // The value returned in the mutable handle argument is part of the + // compartment given as argument to the ExecutionContext constructor. If the + // caller is in a different compartment, then the out-param value should be + // wrapped by calling |JS_WrapValue|. + MOZ_MUST_USE nsresult + ExtractReturnValue(JS::MutableHandle aRetValue); + + // After getting a notification that an off-thread compilation terminated, + // this function will synchronize the result by moving it to the main thread + // before starting the execution of the script. + // + // The compiled script would be returned in the |aScript| out-param. + MOZ_MUST_USE nsresult SyncAndExec(void **aOffThreadToken, + JS::MutableHandle aScript); + + // Compile a script contained in a SourceBuffer, and execute it. + nsresult CompileAndExec(JS::CompileOptions& aCompileOptions, + JS::SourceBufferHolder& aSrcBuf); + + // Compile a script contained in a string, and execute it. + nsresult CompileAndExec(JS::CompileOptions& aCompileOptions, + const nsAString& aScript); + }; + struct MOZ_STACK_CLASS EvaluateOptions { bool coerceToString; JS::AutoObjectVector scopeChain; From a3bd8a3f9917cfd746cefc1df5b7e881552c0769 Mon Sep 17 00:00:00 2001 From: "Nicolas B. Pierron" Date: Wed, 22 Mar 2017 13:42:27 +0000 Subject: [PATCH 252/300] Bug 1331662 part 2 - Replace nsJSUtils::EvaluateString calls by ExecutionContext scopes. r=bz --- dom/base/nsGlobalWindow.cpp | 9 +++- dom/base/nsJSUtils.cpp | 87 ------------------------------ dom/base/nsJSUtils.h | 56 ------------------- dom/base/nsScriptLoader.cpp | 17 +++--- dom/jsurl/nsJSProtocolHandler.cpp | 12 +++-- dom/plugins/base/nsNPAPIPlugin.cpp | 17 ++++-- dom/worklet/Worklet.cpp | 3 -- dom/xbl/nsXBLProtoImplField.cpp | 17 +++--- js/src/jsfriendapi.cpp | 6 +++ js/src/jsfriendapi.h | 3 ++ 10 files changed, 59 insertions(+), 168 deletions(-) diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 4214a8abc3e56..f0d69a3f0cbf1 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -13077,9 +13077,14 @@ nsGlobalWindow::RunTimeoutHandler(Timeout* aTimeout, AutoEntryScript aes(this, reason, true); JS::CompileOptions options(aes.cx()); options.setFileAndLine(filename, lineNo).setVersion(JSVERSION_DEFAULT); + options.setNoScriptRval(true); JS::Rooted global(aes.cx(), FastGetGlobalJSObject()); - nsresult rv = - nsJSUtils::EvaluateString(aes.cx(), script, global, options); + nsresult rv = NS_OK; + { + nsJSUtils::ExecutionContext exec(aes.cx(), global); + rv = exec.CompileAndExec(options, script); + } + if (rv == NS_SUCCESS_DOM_SCRIPT_EVALUATION_THREW_UNCATCHABLE) { abortIntervalHandler = true; } diff --git a/dom/base/nsJSUtils.cpp b/dom/base/nsJSUtils.cpp index 5c8802487b851..6fcf17a1fd1e8 100644 --- a/dom/base/nsJSUtils.cpp +++ b/dom/base/nsJSUtils.cpp @@ -281,93 +281,6 @@ nsJSUtils::ExecutionContext::ExtractReturnValue(JS::MutableHandle aRe return NS_OK; } -nsresult -nsJSUtils::EvaluateString(JSContext* aCx, - const nsAString& aScript, - JS::Handle aEvaluationGlobal, - JS::CompileOptions& aCompileOptions, - const EvaluateOptions& aEvaluateOptions, - JS::MutableHandle aRetValue) -{ - const nsPromiseFlatString& flatScript = PromiseFlatString(aScript); - JS::SourceBufferHolder srcBuf(flatScript.get(), aScript.Length(), - JS::SourceBufferHolder::NoOwnership); - return EvaluateString(aCx, srcBuf, aEvaluationGlobal, aCompileOptions, - aEvaluateOptions, aRetValue, nullptr); -} - -nsresult -nsJSUtils::EvaluateString(JSContext* aCx, - JS::SourceBufferHolder& aSrcBuf, - JS::Handle aEvaluationGlobal, - JS::CompileOptions& aCompileOptions, - const EvaluateOptions& aEvaluateOptions, - JS::MutableHandle aRetValue, - void **aOffThreadToken) -{ - ExecutionContext exec(aCx, aEvaluationGlobal); - exec.SetReturnValue(aCompileOptions) - .SetCoerceToString(aEvaluateOptions.coerceToString); - exec.SetScopeChain(aEvaluateOptions.scopeChain); - - nsresult rv = NS_OK; - if (aOffThreadToken) { - JS::Rooted script(aCx); - rv = exec.SyncAndExec(aOffThreadToken, &script); - } else { - rv = exec.CompileAndExec(aCompileOptions, aSrcBuf); - } - - if (NS_FAILED(rv)) { - return rv; - } - - if (!aCompileOptions.noScriptRval) { - return exec.ExtractReturnValue(aRetValue); - } - - return rv; -} - -nsresult -nsJSUtils::EvaluateString(JSContext* aCx, - JS::SourceBufferHolder& aSrcBuf, - JS::Handle aEvaluationGlobal, - JS::CompileOptions& aCompileOptions, - const EvaluateOptions& aEvaluateOptions, - JS::MutableHandle aRetValue) -{ - return EvaluateString(aCx, aSrcBuf, aEvaluationGlobal, aCompileOptions, - aEvaluateOptions, aRetValue, nullptr); -} - -nsresult -nsJSUtils::EvaluateString(JSContext* aCx, - const nsAString& aScript, - JS::Handle aEvaluationGlobal, - JS::CompileOptions& aCompileOptions) -{ - EvaluateOptions options(aCx); - aCompileOptions.setNoScriptRval(true); - JS::RootedValue unused(aCx); - return EvaluateString(aCx, aScript, aEvaluationGlobal, aCompileOptions, - options, &unused); -} - -nsresult -nsJSUtils::EvaluateString(JSContext* aCx, - JS::SourceBufferHolder& aSrcBuf, - JS::Handle aEvaluationGlobal, - JS::CompileOptions& aCompileOptions, - void **aOffThreadToken) -{ - EvaluateOptions options(aCx); - aCompileOptions.setNoScriptRval(true); - JS::RootedValue unused(aCx); - return EvaluateString(aCx, aSrcBuf, aEvaluationGlobal, aCompileOptions, - options, &unused, aOffThreadToken); -} - nsresult nsJSUtils::CompileModule(JSContext* aCx, JS::SourceBufferHolder& aSrcBuf, diff --git a/dom/base/nsJSUtils.h b/dom/base/nsJSUtils.h index 71c313a714162..e6285b9bf9daa 100644 --- a/dom/base/nsJSUtils.h +++ b/dom/base/nsJSUtils.h @@ -154,52 +154,6 @@ class nsJSUtils const nsAString& aScript); }; - struct MOZ_STACK_CLASS EvaluateOptions { - bool coerceToString; - JS::AutoObjectVector scopeChain; - - explicit EvaluateOptions(JSContext* cx) - : coerceToString(false) - , scopeChain(cx) - {} - - EvaluateOptions& setCoerceToString(bool aCoerce) { - coerceToString = aCoerce; - return *this; - } - }; - - // aEvaluationGlobal is the global to evaluate in. The return value - // will then be wrapped back into the compartment aCx is in when - // this function is called. For all the EvaluateString overloads, - // the JSContext must come from an AutoJSAPI that has had - // TakeOwnershipOfErrorReporting() called on it. - static nsresult EvaluateString(JSContext* aCx, - const nsAString& aScript, - JS::Handle aEvaluationGlobal, - JS::CompileOptions &aCompileOptions, - const EvaluateOptions& aEvaluateOptions, - JS::MutableHandle aRetValue); - - static nsresult EvaluateString(JSContext* aCx, - JS::SourceBufferHolder& aSrcBuf, - JS::Handle aEvaluationGlobal, - JS::CompileOptions &aCompileOptions, - const EvaluateOptions& aEvaluateOptions, - JS::MutableHandle aRetValue); - - - static nsresult EvaluateString(JSContext* aCx, - const nsAString& aScript, - JS::Handle aEvaluationGlobal, - JS::CompileOptions &aCompileOptions); - - static nsresult EvaluateString(JSContext* aCx, - JS::SourceBufferHolder& aSrcBuf, - JS::Handle aEvaluationGlobal, - JS::CompileOptions &aCompileOptions, - void **aOffThreadToken); - static nsresult CompileModule(JSContext* aCx, JS::SourceBufferHolder& aSrcBuf, JS::Handle aEvaluationGlobal, @@ -219,16 +173,6 @@ class nsJSUtils JS::AutoObjectVector& aScopeChain); static void ResetTimeZone(); - -private: - // Implementation for our EvaluateString bits - static nsresult EvaluateString(JSContext* aCx, - JS::SourceBufferHolder& aSrcBuf, - JS::Handle aEvaluationGlobal, - JS::CompileOptions& aCompileOptions, - const EvaluateOptions& aEvaluateOptions, - JS::MutableHandle aRetValue, - void **aOffThreadToken); }; template diff --git a/dom/base/nsScriptLoader.cpp b/dom/base/nsScriptLoader.cpp index 76eb388b171e4..e3aab285aa208 100644 --- a/dom/base/nsScriptLoader.cpp +++ b/dom/base/nsScriptLoader.cpp @@ -2152,8 +2152,6 @@ nsScriptLoader::FillCompileOptionsForRequest(const AutoJSAPI&jsapi, aOptions->setFileAndLine(aRequest->mURL.get(), aRequest->mLineNo); aOptions->setVersion(JSVersion(aRequest->mJSVersion)); aOptions->setIsRunOnce(true); - // We only need the setNoScriptRval bit when compiling off-thread here, since - // otherwise nsJSUtils::EvaluateString will set it up for us. aOptions->setNoScriptRval(true); if (aRequest->mHasSourceMapURL) { aOptions->setSourceMapURL(aRequest->mSourceMapURL.get()); @@ -2258,10 +2256,17 @@ nsScriptLoader::EvaluateScript(nsScriptLoadRequest* aRequest) rv = FillCompileOptionsForRequest(aes, aRequest, global, &options); if (NS_SUCCEEDED(rv)) { - nsAutoString inlineData; - SourceBufferHolder srcBuf = GetScriptSource(aRequest, inlineData); - rv = nsJSUtils::EvaluateString(aes.cx(), srcBuf, global, options, - aRequest->OffThreadTokenPtr()); + { + nsJSUtils::ExecutionContext exec(aes.cx(), global); + if (aRequest->mOffThreadToken) { + JS::Rooted script(aes.cx()); + rv = exec.SyncAndExec(&aRequest->mOffThreadToken, &script); + } else { + nsAutoString inlineData; + SourceBufferHolder srcBuf = GetScriptSource(aRequest, inlineData); + rv = exec.CompileAndExec(options, srcBuf); + } + } } } } diff --git a/dom/jsurl/nsJSProtocolHandler.cpp b/dom/jsurl/nsJSProtocolHandler.cpp index bd8f70e2bc878..0c1b5d9599fcb 100644 --- a/dom/jsurl/nsJSProtocolHandler.cpp +++ b/dom/jsurl/nsJSProtocolHandler.cpp @@ -269,10 +269,14 @@ nsresult nsJSThunk::EvaluateScript(nsIChannel *aChannel, JS::CompileOptions options(cx); options.setFileAndLine(mURL.get(), 1) .setVersion(JSVERSION_DEFAULT); - nsJSUtils::EvaluateOptions evalOptions(cx); - evalOptions.setCoerceToString(true); - rv = nsJSUtils::EvaluateString(cx, NS_ConvertUTF8toUTF16(script), - globalJSObject, options, evalOptions, &v); + { + nsJSUtils::ExecutionContext exec(cx, globalJSObject); + exec.SetCoerceToString(true); + exec.CompileAndExec(options, NS_ConvertUTF8toUTF16(script)); + rv = exec.ExtractReturnValue(&v); + } + + js::AssertSameCompartment(cx, v); if (NS_FAILED(rv) || !(v.isString() || v.isUndefined())) { return NS_ERROR_MALFORMED_URI; diff --git a/dom/plugins/base/nsNPAPIPlugin.cpp b/dom/plugins/base/nsNPAPIPlugin.cpp index af8a182b5e997..6fcc157ce7b91 100644 --- a/dom/plugins/base/nsNPAPIPlugin.cpp +++ b/dom/plugins/base/nsNPAPIPlugin.cpp @@ -1368,14 +1368,23 @@ _evaluate(NPP npp, NPObject* npobj, NPString *script, NPVariant *result) options.setFileAndLine(spec, 0) .setVersion(JSVERSION_DEFAULT); JS::Rooted rval(cx); - nsJSUtils::EvaluateOptions evalOptions(cx); + JS::AutoObjectVector scopeChain(cx); if (obj != js::GetGlobalForObjectCrossCompartment(obj) && - !evalOptions.scopeChain.append(obj)) { + !scopeChain.append(obj)) { return false; } obj = js::GetGlobalForObjectCrossCompartment(obj); - nsresult rv = nsJSUtils::EvaluateString(cx, utf16script, obj, options, - evalOptions, &rval); + nsresult rv = NS_OK; + { + nsJSUtils::ExecutionContext exec(cx, obj); + exec.SetScopeChain(scopeChain); + exec.CompileAndExec(options, utf16script); + rv = exec.ExtractReturnValue(&rval); + } + + if (!JS_WrapValue(cx, &rval)) { + return false; + } return NS_SUCCEEDED(rv) && (!result || JSValToNPVariant(npp, cx, rval, result)); diff --git a/dom/worklet/Worklet.cpp b/dom/worklet/Worklet.cpp index 133ad8cf9224c..77b8a9647ba6b 100644 --- a/dom/worklet/Worklet.cpp +++ b/dom/worklet/Worklet.cpp @@ -205,9 +205,6 @@ class WorkletFetchHandler : public PromiseNativeHandler compileOptions.setFileAndLine(NS_ConvertUTF16toUTF8(mURL).get(), 0); compileOptions.setVersion(JSVERSION_DEFAULT); compileOptions.setIsRunOnce(true); - - // We only need the setNoScriptRval bit when compiling off-thread here, - // since otherwise nsJSUtils::EvaluateString will set it up for us. compileOptions.setNoScriptRval(true); JSAutoCompartment comp(cx, globalObj); diff --git a/dom/xbl/nsXBLProtoImplField.cpp b/dom/xbl/nsXBLProtoImplField.cpp index cc4d0c7591d8a..8860deec10194 100644 --- a/dom/xbl/nsXBLProtoImplField.cpp +++ b/dom/xbl/nsXBLProtoImplField.cpp @@ -427,14 +427,19 @@ nsXBLProtoImplField::InstallField(JS::Handle aBoundNode, JS::CompileOptions options(cx); options.setFileAndLine(uriSpec.get(), mLineNumber) .setVersion(JSVERSION_LATEST); - nsJSUtils::EvaluateOptions evalOptions(cx); - if (!nsJSUtils::GetScopeChainForElement(cx, boundElement, - evalOptions.scopeChain)) { + JS::AutoObjectVector scopeChain(cx); + if (!nsJSUtils::GetScopeChainForElement(cx, boundElement, scopeChain)) { return NS_ERROR_OUT_OF_MEMORY; } - rv = nsJSUtils::EvaluateString(cx, nsDependentString(mFieldText, - mFieldTextLength), - scopeObject, options, evalOptions, &result); + rv = NS_OK; + { + nsJSUtils::ExecutionContext exec(cx, scopeObject); + exec.SetScopeChain(scopeChain); + exec.CompileAndExec(options, nsDependentString(mFieldText, + mFieldTextLength)); + rv = exec.ExtractReturnValue(&result); + } + if (NS_FAILED(rv)) { return rv; } diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 0989b942fb399..356ff8597c668 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -378,6 +378,12 @@ js::AssertSameCompartment(JSContext* cx, JSObject* obj) assertSameCompartment(cx, obj); } +JS_FRIEND_API(void) +js::AssertSameCompartment(JSContext* cx, JS::HandleValue v) +{ + assertSameCompartment(cx, v); +} + #ifdef DEBUG JS_FRIEND_API(void) js::AssertSameCompartment(JSObject* objA, JSObject* objB) diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 76745822486e0..41f7c0cae7b71 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -653,6 +653,9 @@ GetPrototypeNoProxy(JSObject* obj); JS_FRIEND_API(void) AssertSameCompartment(JSContext* cx, JSObject* obj); +JS_FRIEND_API(void) +AssertSameCompartment(JSContext* cx, JS::HandleValue v); + #ifdef JS_DEBUG JS_FRIEND_API(void) AssertSameCompartment(JSObject* objA, JSObject* objB); From 882a79bcf802ec00e2b1fa73fc228f2386b871c2 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Sat, 18 Mar 2017 16:08:12 -0400 Subject: [PATCH 253/300] Bug 1316683 - Avoid going into SpiderMonkey for retrieving origin attributes; r=baku Our caller is C++ code, and the implementations are all also written in C++, so there is no reason to go through SpiderMonkey here. This patch also makes nsILoadContext builtinclass to ensure that the implementation is always native. --- caps/nsScriptSecurityManager.cpp | 3 +- docshell/base/LoadContext.cpp | 30 ++++--------------- docshell/base/LoadContext.h | 2 ++ docshell/base/SerializedLoadContext.cpp | 4 +-- docshell/base/nsDocShell.cpp | 6 ++++ docshell/base/nsDocShell.h | 2 ++ docshell/base/nsILoadContext.idl | 6 ++-- dom/base/nsDocument.h | 20 +++++++++---- dom/ipc/TabParent.cpp | 1 + dom/offline/nsDOMOfflineResourceList.cpp | 3 +- .../prefetch/OfflineCacheUpdateParent.cpp | 8 +++++ uriloader/prefetch/OfflineCacheUpdateParent.h | 2 ++ 12 files changed, 46 insertions(+), 41 deletions(-) diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 0d587f8115a3c..7d70c97a8f1e6 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -1168,8 +1168,7 @@ nsScriptSecurityManager:: { NS_ENSURE_STATE(aLoadContext); OriginAttributes docShellAttrs; - bool result = aLoadContext->GetOriginAttributes(docShellAttrs); - NS_ENSURE_TRUE(result, NS_ERROR_FAILURE); + aLoadContext->GetOriginAttributes(docShellAttrs); nsCOMPtr prin = BasePrincipal::CreateCodebasePrincipal(aURI, docShellAttrs); diff --git a/docshell/base/LoadContext.cpp b/docshell/base/LoadContext.cpp index 6c3ba6b523119..03fa532731890 100644 --- a/docshell/base/LoadContext.cpp +++ b/docshell/base/LoadContext.cpp @@ -12,30 +12,6 @@ #include "nsContentUtils.h" #include "xpcpublic.h" -bool -nsILoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - mozilla::dom::AutoJSAPI jsapi; - bool ok = jsapi.Init(xpc::PrivilegedJunkScope()); - NS_ENSURE_TRUE(ok, false); - JS::Rooted v(jsapi.cx()); - nsresult rv = GetOriginAttributes(&v); - NS_ENSURE_SUCCESS(rv, false); - NS_ENSURE_TRUE(v.isObject(), false); - JS::Rooted obj(jsapi.cx(), &v.toObject()); - - // If we're JS-implemented, the object will be left in a different (System-Principaled) - // scope, so we may need to enter its compartment. - MOZ_ASSERT(nsContentUtils::IsSystemPrincipal(nsContentUtils::ObjectPrincipal(obj))); - JSAutoCompartment ac(jsapi.cx(), obj); - - mozilla::OriginAttributes attrs; - ok = attrs.Init(jsapi.cx(), v); - NS_ENSURE_TRUE(ok, false); - aAttrs = attrs; - return true; -} - namespace mozilla { NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor) @@ -181,6 +157,12 @@ LoadContext::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } +NS_IMETHODIMP_(void) +LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + aAttrs = mOriginAttributes; +} + NS_IMETHODIMP LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/docshell/base/LoadContext.h b/docshell/base/LoadContext.h index 0b05899ab9346..ac81dbd3e06e1 100644 --- a/docshell/base/LoadContext.h +++ b/docshell/base/LoadContext.h @@ -111,6 +111,8 @@ class LoadContext final private: ~LoadContext() {} + void GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; + nsWeakPtr mTopFrameElement; uint64_t mNestedFrameId; bool mIsContent; diff --git a/docshell/base/SerializedLoadContext.cpp b/docshell/base/SerializedLoadContext.cpp index 501a417a5125a..3964a78f9fc3e 100644 --- a/docshell/base/SerializedLoadContext.cpp +++ b/docshell/base/SerializedLoadContext.cpp @@ -62,9 +62,7 @@ SerializedLoadContext::Init(nsILoadContext* aLoadContext) aLoadContext->GetIsContent(&mIsContent); aLoadContext->GetUseRemoteTabs(&mUseRemoteTabs); aLoadContext->GetUseTrackingProtection(&mUseTrackingProtection); - if (!aLoadContext->GetOriginAttributes(mOriginAttributes)) { - NS_WARNING("GetOriginAttributes failed"); - } + aLoadContext->GetOriginAttributes(mOriginAttributes); } else { mIsNotNull = false; mIsPrivateBitValid = false; diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 6ed2909fb70e1..d07474e493c3d 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -14944,3 +14944,9 @@ nsDocShell::GetAwaitingLargeAlloc(bool* aResult) *aResult = static_cast(tabChild.get())->IsAwaitingLargeAlloc(); return NS_OK; } + +NS_IMETHODIMP_(void) +nsDocShell::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + aAttrs = mOriginAttributes; +} diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index 9378970233404..6b5a06888deb8 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -806,6 +806,8 @@ class nsDocShell final void UpdateGlobalHistoryTitle(nsIURI* aURI); + void GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; + // Dimensions of the docshell nsIntRect mBounds; nsString mName; diff --git a/docshell/base/nsILoadContext.idl b/docshell/base/nsILoadContext.idl index 98e8a21191714..d3a39a676c79b 100644 --- a/docshell/base/nsILoadContext.idl +++ b/docshell/base/nsILoadContext.idl @@ -20,7 +20,7 @@ interface nsIDOMElement; * can be queried for various information about where the load is * happening. */ -[scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] +[builtinclass, scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] interface nsILoadContext : nsISupports { /** @@ -139,10 +139,8 @@ interface nsILoadContext : nsISupports #ifdef MOZILLA_INTERNAL_API /** * The C++ getter for origin attributes. - * - * Defined in LoadContext.cpp */ - bool GetOriginAttributes(mozilla::OriginAttributes& aAttrs); + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) = 0; #endif %} }; diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h index 2dc245147f38e..7218e6def399d 100644 --- a/dom/base/nsDocument.h +++ b/dom/base/nsDocument.h @@ -444,7 +444,7 @@ class nsExternalResourceMap // implement one interface. // XXXbz I wish we could just derive the _allcaps thing from _i -#define DECL_SHIM(_i, _allcaps) \ +#define DECL_SHIM(_i, _allcaps, _customfwd) \ class _i##Shim final : public nsIInterfaceRequestor, \ public _i \ { \ @@ -459,17 +459,25 @@ class nsExternalResourceMap NS_DECL_ISUPPORTS \ NS_FORWARD_NSIINTERFACEREQUESTOR(mIfReq->) \ NS_FORWARD_##_allcaps(mRealPtr->) \ + _customfwd \ private: \ nsCOMPtr mIfReq; \ nsCOMPtr<_i> mRealPtr; \ }; - DECL_SHIM(nsILoadContext, NSILOADCONTEXT) - DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK) - DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK) - DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK) - DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER) +#define DECL_FORWARD_CPP_GETORIGINATTRIBUTES \ + NS_IMETHODIMP_(void) \ + GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override \ + { \ + mRealPtr->GetOriginAttributes(aAttrs); \ + } + DECL_SHIM(nsILoadContext, NSILOADCONTEXT, DECL_FORWARD_CPP_GETORIGINATTRIBUTES) + DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK, ) + DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK, ) + DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK, ) + DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER, ) #undef DECL_SHIM +#undef DECL_FORWARD_CPP_GETORIGINATTRIBUTES }; /** diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index 87163e1bcb91c..e6e144df1a892 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -3020,6 +3020,7 @@ class FakeChannel final : public nsIChannel, NS_IMETHOD SetPrivateBrowsing(bool) NO_IMPL NS_IMETHOD GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL NS_IMETHOD GetOriginAttributes(JS::MutableHandleValue) NO_IMPL + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override {} NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL NS_IMETHOD SetRemoteTabs(bool) NO_IMPL NS_IMETHOD GetUseTrackingProtection(bool*) NO_IMPL diff --git a/dom/offline/nsDOMOfflineResourceList.cpp b/dom/offline/nsDOMOfflineResourceList.cpp index a02b2956245e5..b6b49670b8b76 100644 --- a/dom/offline/nsDOMOfflineResourceList.cpp +++ b/dom/offline/nsDOMOfflineResourceList.cpp @@ -815,8 +815,7 @@ nsDOMOfflineResourceList::CacheKeys() nsAutoCString originSuffix; if (loadContext) { mozilla::OriginAttributes oa; - bool ok = loadContext->GetOriginAttributes(oa); - NS_ENSURE_TRUE(ok, NS_ERROR_UNEXPECTED); + loadContext->GetOriginAttributes(oa); oa.CreateSuffix(originSuffix); } diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.cpp b/uriloader/prefetch/OfflineCacheUpdateParent.cpp index c77f2b49a02ee..f10821292b715 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.cpp +++ b/uriloader/prefetch/OfflineCacheUpdateParent.cpp @@ -276,6 +276,14 @@ OfflineCacheUpdateParent::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } +NS_IMETHODIMP_(void) +OfflineCacheUpdateParent::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + if (mLoadingPrincipal) { + aAttrs = mLoadingPrincipal->OriginAttributesRef(); + } +} + NS_IMETHODIMP OfflineCacheUpdateParent::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.h b/uriloader/prefetch/OfflineCacheUpdateParent.h index f6dbc1cb2a6f9..ee3c22ea74cd6 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.h +++ b/uriloader/prefetch/OfflineCacheUpdateParent.h @@ -54,6 +54,8 @@ class OfflineCacheUpdateParent : public POfflineCacheUpdateParent private: ~OfflineCacheUpdateParent(); + void GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; + bool mIPCClosed; nsCOMPtr mLoadingPrincipal; From 3ad49b5a786736a982b4a7ad3b29e462f5a5cb41 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Wed, 22 Mar 2017 15:15:27 +0100 Subject: [PATCH 254/300] Backed out changeset 7e47807067a6 (bug 1316683) for Windows bustage. r=backout --- caps/nsScriptSecurityManager.cpp | 3 +- docshell/base/LoadContext.cpp | 30 +++++++++++++++---- docshell/base/LoadContext.h | 2 -- docshell/base/SerializedLoadContext.cpp | 4 ++- docshell/base/nsDocShell.cpp | 6 ---- docshell/base/nsDocShell.h | 2 -- docshell/base/nsILoadContext.idl | 6 ++-- dom/base/nsDocument.h | 20 ++++--------- dom/ipc/TabParent.cpp | 1 - dom/offline/nsDOMOfflineResourceList.cpp | 3 +- .../prefetch/OfflineCacheUpdateParent.cpp | 8 ----- uriloader/prefetch/OfflineCacheUpdateParent.h | 2 -- 12 files changed, 41 insertions(+), 46 deletions(-) diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 7d70c97a8f1e6..0d587f8115a3c 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -1168,7 +1168,8 @@ nsScriptSecurityManager:: { NS_ENSURE_STATE(aLoadContext); OriginAttributes docShellAttrs; - aLoadContext->GetOriginAttributes(docShellAttrs); + bool result = aLoadContext->GetOriginAttributes(docShellAttrs); + NS_ENSURE_TRUE(result, NS_ERROR_FAILURE); nsCOMPtr prin = BasePrincipal::CreateCodebasePrincipal(aURI, docShellAttrs); diff --git a/docshell/base/LoadContext.cpp b/docshell/base/LoadContext.cpp index 03fa532731890..6c3ba6b523119 100644 --- a/docshell/base/LoadContext.cpp +++ b/docshell/base/LoadContext.cpp @@ -12,6 +12,30 @@ #include "nsContentUtils.h" #include "xpcpublic.h" +bool +nsILoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + mozilla::dom::AutoJSAPI jsapi; + bool ok = jsapi.Init(xpc::PrivilegedJunkScope()); + NS_ENSURE_TRUE(ok, false); + JS::Rooted v(jsapi.cx()); + nsresult rv = GetOriginAttributes(&v); + NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_TRUE(v.isObject(), false); + JS::Rooted obj(jsapi.cx(), &v.toObject()); + + // If we're JS-implemented, the object will be left in a different (System-Principaled) + // scope, so we may need to enter its compartment. + MOZ_ASSERT(nsContentUtils::IsSystemPrincipal(nsContentUtils::ObjectPrincipal(obj))); + JSAutoCompartment ac(jsapi.cx(), obj); + + mozilla::OriginAttributes attrs; + ok = attrs.Init(jsapi.cx(), v); + NS_ENSURE_TRUE(ok, false); + aAttrs = attrs; + return true; +} + namespace mozilla { NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor) @@ -157,12 +181,6 @@ LoadContext::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } -NS_IMETHODIMP_(void) -LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - aAttrs = mOriginAttributes; -} - NS_IMETHODIMP LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/docshell/base/LoadContext.h b/docshell/base/LoadContext.h index ac81dbd3e06e1..0b05899ab9346 100644 --- a/docshell/base/LoadContext.h +++ b/docshell/base/LoadContext.h @@ -111,8 +111,6 @@ class LoadContext final private: ~LoadContext() {} - void GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; - nsWeakPtr mTopFrameElement; uint64_t mNestedFrameId; bool mIsContent; diff --git a/docshell/base/SerializedLoadContext.cpp b/docshell/base/SerializedLoadContext.cpp index 3964a78f9fc3e..501a417a5125a 100644 --- a/docshell/base/SerializedLoadContext.cpp +++ b/docshell/base/SerializedLoadContext.cpp @@ -62,7 +62,9 @@ SerializedLoadContext::Init(nsILoadContext* aLoadContext) aLoadContext->GetIsContent(&mIsContent); aLoadContext->GetUseRemoteTabs(&mUseRemoteTabs); aLoadContext->GetUseTrackingProtection(&mUseTrackingProtection); - aLoadContext->GetOriginAttributes(mOriginAttributes); + if (!aLoadContext->GetOriginAttributes(mOriginAttributes)) { + NS_WARNING("GetOriginAttributes failed"); + } } else { mIsNotNull = false; mIsPrivateBitValid = false; diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index d07474e493c3d..6ed2909fb70e1 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -14944,9 +14944,3 @@ nsDocShell::GetAwaitingLargeAlloc(bool* aResult) *aResult = static_cast(tabChild.get())->IsAwaitingLargeAlloc(); return NS_OK; } - -NS_IMETHODIMP_(void) -nsDocShell::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - aAttrs = mOriginAttributes; -} diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index 6b5a06888deb8..9378970233404 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -806,8 +806,6 @@ class nsDocShell final void UpdateGlobalHistoryTitle(nsIURI* aURI); - void GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; - // Dimensions of the docshell nsIntRect mBounds; nsString mName; diff --git a/docshell/base/nsILoadContext.idl b/docshell/base/nsILoadContext.idl index d3a39a676c79b..98e8a21191714 100644 --- a/docshell/base/nsILoadContext.idl +++ b/docshell/base/nsILoadContext.idl @@ -20,7 +20,7 @@ interface nsIDOMElement; * can be queried for various information about where the load is * happening. */ -[builtinclass, scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] +[scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] interface nsILoadContext : nsISupports { /** @@ -139,8 +139,10 @@ interface nsILoadContext : nsISupports #ifdef MOZILLA_INTERNAL_API /** * The C++ getter for origin attributes. + * + * Defined in LoadContext.cpp */ - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) = 0; + bool GetOriginAttributes(mozilla::OriginAttributes& aAttrs); #endif %} }; diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h index 7218e6def399d..2dc245147f38e 100644 --- a/dom/base/nsDocument.h +++ b/dom/base/nsDocument.h @@ -444,7 +444,7 @@ class nsExternalResourceMap // implement one interface. // XXXbz I wish we could just derive the _allcaps thing from _i -#define DECL_SHIM(_i, _allcaps, _customfwd) \ +#define DECL_SHIM(_i, _allcaps) \ class _i##Shim final : public nsIInterfaceRequestor, \ public _i \ { \ @@ -459,25 +459,17 @@ class nsExternalResourceMap NS_DECL_ISUPPORTS \ NS_FORWARD_NSIINTERFACEREQUESTOR(mIfReq->) \ NS_FORWARD_##_allcaps(mRealPtr->) \ - _customfwd \ private: \ nsCOMPtr mIfReq; \ nsCOMPtr<_i> mRealPtr; \ }; -#define DECL_FORWARD_CPP_GETORIGINATTRIBUTES \ - NS_IMETHODIMP_(void) \ - GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override \ - { \ - mRealPtr->GetOriginAttributes(aAttrs); \ - } - DECL_SHIM(nsILoadContext, NSILOADCONTEXT, DECL_FORWARD_CPP_GETORIGINATTRIBUTES) - DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK, ) - DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK, ) - DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK, ) - DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER, ) + DECL_SHIM(nsILoadContext, NSILOADCONTEXT) + DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK) + DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK) + DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK) + DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER) #undef DECL_SHIM -#undef DECL_FORWARD_CPP_GETORIGINATTRIBUTES }; /** diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index e6e144df1a892..87163e1bcb91c 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -3020,7 +3020,6 @@ class FakeChannel final : public nsIChannel, NS_IMETHOD SetPrivateBrowsing(bool) NO_IMPL NS_IMETHOD GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL NS_IMETHOD GetOriginAttributes(JS::MutableHandleValue) NO_IMPL - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override {} NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL NS_IMETHOD SetRemoteTabs(bool) NO_IMPL NS_IMETHOD GetUseTrackingProtection(bool*) NO_IMPL diff --git a/dom/offline/nsDOMOfflineResourceList.cpp b/dom/offline/nsDOMOfflineResourceList.cpp index b6b49670b8b76..a02b2956245e5 100644 --- a/dom/offline/nsDOMOfflineResourceList.cpp +++ b/dom/offline/nsDOMOfflineResourceList.cpp @@ -815,7 +815,8 @@ nsDOMOfflineResourceList::CacheKeys() nsAutoCString originSuffix; if (loadContext) { mozilla::OriginAttributes oa; - loadContext->GetOriginAttributes(oa); + bool ok = loadContext->GetOriginAttributes(oa); + NS_ENSURE_TRUE(ok, NS_ERROR_UNEXPECTED); oa.CreateSuffix(originSuffix); } diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.cpp b/uriloader/prefetch/OfflineCacheUpdateParent.cpp index f10821292b715..c77f2b49a02ee 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.cpp +++ b/uriloader/prefetch/OfflineCacheUpdateParent.cpp @@ -276,14 +276,6 @@ OfflineCacheUpdateParent::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } -NS_IMETHODIMP_(void) -OfflineCacheUpdateParent::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - if (mLoadingPrincipal) { - aAttrs = mLoadingPrincipal->OriginAttributesRef(); - } -} - NS_IMETHODIMP OfflineCacheUpdateParent::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.h b/uriloader/prefetch/OfflineCacheUpdateParent.h index ee3c22ea74cd6..f6dbc1cb2a6f9 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.h +++ b/uriloader/prefetch/OfflineCacheUpdateParent.h @@ -54,8 +54,6 @@ class OfflineCacheUpdateParent : public POfflineCacheUpdateParent private: ~OfflineCacheUpdateParent(); - void GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; - bool mIPCClosed; nsCOMPtr mLoadingPrincipal; From 7c9295fe3110225a459baf0db3dfae8eaee5a206 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Wed, 22 Mar 2017 09:05:36 -0400 Subject: [PATCH 255/300] Bug 1343499 - Expose native image sizes to imagelib users. r=tnikkel --- image/DynamicImage.cpp | 6 ++ image/DynamicImage.h | 1 + image/FrameTimeout.h | 119 ++++++++++++++++++++++ image/ImageMetadata.h | 13 ++- image/ImageOps.cpp | 110 ++++++++++++++++++-- image/ImageOps.h | 61 ++++++++++- image/ImageWrapper.cpp | 6 ++ image/ImageWrapper.h | 1 + image/OrientedImage.cpp | 16 +++ image/OrientedImage.h | 1 + image/RasterImage.cpp | 19 ++++ image/RasterImage.h | 2 + image/VectorImage.cpp | 7 ++ image/VectorImage.h | 1 + image/decoders/nsICODecoder.cpp | 2 + image/imgFrame.h | 101 +----------------- image/imgIContainer.idl | 4 + image/moz.build | 2 + image/test/gtest/Common.cpp | 6 ++ image/test/gtest/Common.h | 2 + image/test/gtest/TestDecodeToSurface.cpp | 84 +++++++++++++-- image/test/gtest/TestDecoders.cpp | 84 +++++++++++++++ image/test/gtest/green-multiple-sizes.ico | Bin 0 -> 14144 bytes image/test/gtest/moz.build | 1 + 24 files changed, 530 insertions(+), 119 deletions(-) create mode 100644 image/FrameTimeout.h create mode 100644 image/test/gtest/green-multiple-sizes.ico diff --git a/image/DynamicImage.cpp b/image/DynamicImage.cpp index d6444066a9e92..47c920944c3ec 100644 --- a/image/DynamicImage.cpp +++ b/image/DynamicImage.cpp @@ -127,6 +127,12 @@ DynamicImage::GetHeight(int32_t* aHeight) return NS_OK; } +nsresult +DynamicImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + NS_IMETHODIMP DynamicImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/DynamicImage.h b/image/DynamicImage.h index a39a29b8e37ed..09c6ed550a257 100644 --- a/image/DynamicImage.h +++ b/image/DynamicImage.h @@ -31,6 +31,7 @@ class DynamicImage : public Image } // Inherited methods from Image. + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t SizeOfSourceWithComputedFallback( MallocSizeOf aMallocSizeOf) const override; diff --git a/image/FrameTimeout.h b/image/FrameTimeout.h new file mode 100644 index 0000000000000..4070bba65b2b5 --- /dev/null +++ b/image/FrameTimeout.h @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_image_FrameTimeout_h +#define mozilla_image_FrameTimeout_h + +#include +#include "mozilla/Assertions.h" + +namespace mozilla { +namespace image { + +/** + * FrameTimeout wraps a frame timeout value (measured in milliseconds) after + * first normalizing it. This normalization is necessary because some tools + * generate incorrect frame timeout values which we nevertheless have to + * support. For this reason, code that deals with frame timeouts should always + * use a FrameTimeout value rather than the raw value from the image header. + */ +struct FrameTimeout +{ + /** + * @return a FrameTimeout of zero. This should be used only for math + * involving FrameTimeout values. You can't obtain a zero FrameTimeout from + * FromRawMilliseconds(). + */ + static FrameTimeout Zero() { return FrameTimeout(0); } + + /// @return an infinite FrameTimeout. + static FrameTimeout Forever() { return FrameTimeout(-1); } + + /// @return a FrameTimeout obtained by normalizing a raw timeout value. + static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) + { + // Normalize all infinite timeouts to the same value. + if (aRawMilliseconds < 0) { + return FrameTimeout::Forever(); + } + + // Very small timeout values are problematic for two reasons: we don't want + // to burn energy redrawing animated images extremely fast, and broken tools + // generate these values when they actually want a "default" value, so such + // images won't play back right without normalization. For some context, + // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical + // behavior of IE and Opera was: + // IE 6/Win: + // 10 - 50ms is normalized to 100ms. + // >50ms is used unnormalized. + // Opera 7 final/Win: + // 10ms is normalized to 100ms. + // >10ms is used unnormalized. + if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { + return FrameTimeout(100); + } + + // The provided timeout value is OK as-is. + return FrameTimeout(aRawMilliseconds); + } + + bool operator==(const FrameTimeout& aOther) const + { + return mTimeout == aOther.mTimeout; + } + + bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } + + FrameTimeout operator+(const FrameTimeout& aOther) + { + if (*this == Forever() || aOther == Forever()) { + return Forever(); + } + + return FrameTimeout(mTimeout + aOther.mTimeout); + } + + FrameTimeout& operator+=(const FrameTimeout& aOther) + { + *this = *this + aOther; + return *this; + } + + /** + * @return this FrameTimeout's value in milliseconds. Illegal to call on a + * an infinite FrameTimeout value. + */ + uint32_t AsMilliseconds() const + { + if (*this == Forever()) { + MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); + return 100; // Fail to something sane. + } + + return uint32_t(mTimeout); + } + + /** + * @return this FrameTimeout value encoded so that non-negative values + * represent a timeout in milliseconds, and -1 represents an infinite + * timeout. + * + * XXX(seth): This is a backwards compatibility hack that should be removed. + */ + int32_t AsEncodedValueDeprecated() const { return mTimeout; } + +private: + explicit FrameTimeout(int32_t aTimeout) + : mTimeout(aTimeout) + { } + + int32_t mTimeout; +}; + +} // namespace image +} // namespace mozilla + +#endif // mozilla_image_FrameTimeout_h diff --git a/image/ImageMetadata.h b/image/ImageMetadata.h index 05f5729802c71..b1a2edfb03fde 100644 --- a/image/ImageMetadata.h +++ b/image/ImageMetadata.h @@ -11,12 +11,11 @@ #include "mozilla/Maybe.h" #include "nsSize.h" #include "Orientation.h" +#include "FrameTimeout.h" namespace mozilla { namespace image { -class RasterImage; - // The metadata about an image that decoders accumulate as they decode. class ImageMetadata { @@ -64,6 +63,13 @@ class ImageMetadata nsIntSize GetSize() const { return *mSize; } bool HasSize() const { return mSize.isSome(); } + void AddNativeSize(const nsIntSize& aSize) + { + mNativeSizes.AppendElement(aSize); + } + + const nsTArray& GetNativeSizes() const { return mNativeSizes; } + Orientation GetOrientation() const { return *mOrientation; } bool HasOrientation() const { return mOrientation.isSome(); } @@ -90,6 +96,9 @@ class ImageMetadata Maybe mSize; Maybe mOrientation; + // Sizes the image can natively decode to. + nsTArray mNativeSizes; + bool mHasAnimation : 1; }; diff --git a/image/ImageOps.cpp b/image/ImageOps.cpp index d1d5da283642d..fb4fc8fb70751 100644 --- a/image/ImageOps.cpp +++ b/image/ImageOps.cpp @@ -14,6 +14,7 @@ #include "FrozenImage.h" #include "IDecodingTask.h" #include "Image.h" +#include "ImageMetadata.h" #include "imgIContainer.h" #include "mozilla/gfx/2D.h" #include "nsStreamUtils.h" @@ -79,10 +80,27 @@ ImageOps::CreateFromDrawable(gfxDrawable* aDrawable) return drawableImage.forget(); } -/* static */ already_AddRefed -ImageOps::DecodeToSurface(nsIInputStream* aInputStream, - const nsACString& aMimeType, - uint32_t aFlags) +class ImageOps::ImageBufferImpl final : public ImageOps::ImageBuffer { +public: + ImageBufferImpl(already_AddRefed aSourceBuffer) + : mSourceBuffer(aSourceBuffer) + { } + +protected: + ~ImageBufferImpl() override { } + + virtual already_AddRefed GetSourceBuffer() + { + RefPtr sourceBuffer = mSourceBuffer; + return sourceBuffer.forget(); + } + +private: + RefPtr mSourceBuffer; +}; + +/* static */ already_AddRefed +ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) { MOZ_ASSERT(aInputStream); @@ -107,7 +125,7 @@ ImageOps::DecodeToSurface(nsIInputStream* aInputStream, } // Write the data into a SourceBuffer. - NotNull> sourceBuffer = WrapNotNull(new SourceBuffer()); + RefPtr sourceBuffer = new SourceBuffer(); sourceBuffer->ExpectLength(length); rv = sourceBuffer->AppendFromInputStream(inputStream, length); if (NS_FAILED(rv)) { @@ -122,12 +140,90 @@ ImageOps::DecodeToSurface(nsIInputStream* aInputStream, } sourceBuffer->Complete(NS_OK); + RefPtr imageBuffer = new ImageBufferImpl(sourceBuffer.forget()); + return imageBuffer.forget(); +} + +/* static */ nsresult +ImageOps::DecodeMetadata(nsIInputStream* aInputStream, + const nsACString& aMimeType, + ImageMetadata& aMetadata) +{ + RefPtr buffer = CreateImageBuffer(aInputStream); + return DecodeMetadata(buffer, aMimeType, aMetadata); +} + +/* static */ nsresult +ImageOps::DecodeMetadata(ImageBuffer* aBuffer, + const nsACString& aMimeType, + ImageMetadata& aMetadata) +{ + if (!aBuffer) { + return NS_ERROR_FAILURE; + } + + RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); + if (NS_WARN_IF(!sourceBuffer)) { + return NS_ERROR_FAILURE; + } + + // Create a decoder. + DecoderType decoderType = + DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); + RefPtr decoder = + DecoderFactory::CreateAnonymousMetadataDecoder(decoderType, + WrapNotNull(sourceBuffer)); + if (!decoder) { + return NS_ERROR_FAILURE; + } + + // Run the decoder synchronously. + RefPtr task = new AnonymousDecodingTask(WrapNotNull(decoder)); + task->Run(); + if (!decoder->GetDecodeDone() || decoder->HasError()) { + return NS_ERROR_FAILURE; + } + + aMetadata = decoder->GetImageMetadata(); + if (aMetadata.GetNativeSizes().IsEmpty() && aMetadata.HasSize()) { + aMetadata.AddNativeSize(aMetadata.GetSize()); + } + + return NS_OK; +} + +/* static */ already_AddRefed +ImageOps::DecodeToSurface(nsIInputStream* aInputStream, + const nsACString& aMimeType, + uint32_t aFlags, + Maybe aSize /* = Nothing() */) +{ + RefPtr buffer = CreateImageBuffer(aInputStream); + return DecodeToSurface(buffer, aMimeType, aFlags, aSize); +} + +/* static */ already_AddRefed +ImageOps::DecodeToSurface(ImageBuffer* aBuffer, + const nsACString& aMimeType, + uint32_t aFlags, + Maybe aSize /* = Nothing() */) +{ + if (!aBuffer) { + return nullptr; + } + + RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); + if (NS_WARN_IF(!sourceBuffer)) { + return nullptr; + } + // Create a decoder. DecoderType decoderType = DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); RefPtr decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, - Nothing(), ToSurfaceFlags(aFlags)); + DecoderFactory::CreateAnonymousDecoder(decoderType, + WrapNotNull(sourceBuffer), + aSize, ToSurfaceFlags(aFlags)); if (!decoder) { return nullptr; } diff --git a/image/ImageOps.h b/image/ImageOps.h index 7a8e19be34410..5a089fd16b030 100644 --- a/image/ImageOps.h +++ b/image/ImageOps.h @@ -9,6 +9,7 @@ #include "nsCOMPtr.h" #include "nsRect.h" +#include "ImageMetadata.h" class gfxDrawable; class imgIContainer; @@ -24,10 +25,23 @@ namespace image { class Image; struct Orientation; +class SourceBuffer; class ImageOps { public: + class ImageBuffer { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageOps::ImageBuffer); + protected: + friend class ImageOps; + + ImageBuffer() { } + virtual ~ImageBuffer() { } + + virtual already_AddRefed GetSourceBuffer() = 0; + }; + /** * Creates a version of an existing image which does not animate and is frozen * at the first frame. @@ -74,6 +88,39 @@ class ImageOps static already_AddRefed CreateFromDrawable(gfxDrawable* aDrawable); + /** + * Create a buffer to be used with DecodeMetadata and DecodeToSurface. Reusing + * an ImageBuffer representing the given input stream is more efficient if one + * has multiple Decode* calls to make on that stream. + * + * @param aInputStream An input stream containing an encoded image. + * @return An image buffer derived from the input stream. + */ + static already_AddRefed + CreateImageBuffer(nsIInputStream* aInputStream); + + /** + * Decodes an image's metadata from an nsIInputStream into the given + * structure. This function may be called off-main-thread. + * + * @param aInputStream An input stream containing an encoded image. + * @param aMimeType The MIME type of the image. + * @param aMetadata Where the image metadata is stored upon success. + * @return The status of the operation. + */ + static nsresult + DecodeMetadata(nsIInputStream* aInputStream, + const nsACString& aMimeType, + ImageMetadata& aMetadata); + + /** + * Same as above but takes an ImageBuffer instead of nsIInputStream. + */ + static nsresult + DecodeMetadata(ImageBuffer* aBuffer, + const nsACString& aMimeType, + ImageMetadata& aMetadata); + /** * Decodes an image from an nsIInputStream directly into a SourceSurface, * without ever creating an Image or imgIContainer (which are mostly @@ -89,9 +136,21 @@ class ImageOps static already_AddRefed DecodeToSurface(nsIInputStream* aInputStream, const nsACString& aMimeType, - uint32_t aFlags); + uint32_t aFlags, + Maybe aSize = Nothing()); + + /** + * Same as above but takes an ImageBuffer instead of nsIInputStream. + */ + static already_AddRefed + DecodeToSurface(ImageBuffer* aBuffer, + const nsACString& aMimeType, + uint32_t aFlags, + Maybe aSize = Nothing()); private: + class ImageBufferImpl; + // This is a static utility class, so disallow instantiation. virtual ~ImageOps() = 0; }; diff --git a/image/ImageWrapper.cpp b/image/ImageWrapper.cpp index dfc76641fd6f4..8524799045679 100644 --- a/image/ImageWrapper.cpp +++ b/image/ImageWrapper.cpp @@ -139,6 +139,12 @@ ImageWrapper::GetHeight(int32_t* aHeight) return mInnerImage->GetHeight(aHeight); } +nsresult +ImageWrapper::GetNativeSizes(nsTArray& aNativeSizes) const +{ + return mInnerImage->GetNativeSizes(aNativeSizes); +} + NS_IMETHODIMP ImageWrapper::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/ImageWrapper.h b/image/ImageWrapper.h index 94cf0948b537c..19e9cb8582329 100644 --- a/image/ImageWrapper.h +++ b/image/ImageWrapper.h @@ -22,6 +22,7 @@ class ImageWrapper : public Image NS_DECL_IMGICONTAINER // Inherited methods from Image. + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t diff --git a/image/OrientedImage.cpp b/image/OrientedImage.cpp index 951b0acbc94d1..79767e2a796ab 100644 --- a/image/OrientedImage.cpp +++ b/image/OrientedImage.cpp @@ -46,6 +46,22 @@ OrientedImage::GetHeight(int32_t* aHeight) } } +nsresult +OrientedImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + nsresult rv = InnerImage()->GetNativeSizes(aNativeSizes); + + if (mOrientation.SwapsWidthAndHeight()) { + auto i = aNativeSizes.Length(); + while (i > 0) { + --i; + swap(aNativeSizes[i].width, aNativeSizes[i].height); + } + } + + return rv; +} + NS_IMETHODIMP OrientedImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/OrientedImage.h b/image/OrientedImage.h index 2edf05de9f50c..d1291ea74b20a 100644 --- a/image/OrientedImage.h +++ b/image/OrientedImage.h @@ -30,6 +30,7 @@ class OrientedImage : public ImageWrapper NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override; NS_IMETHOD_(already_AddRefed) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index b987448502951..b3da4ff3697e6 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -220,6 +220,24 @@ RasterImage::GetHeight(int32_t* aHeight) return NS_OK; } +//****************************************************************************** +nsresult +RasterImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + if (mError) { + return NS_ERROR_FAILURE; + } + + if (mNativeSizes.IsEmpty()) { + aNativeSizes.Clear(); + aNativeSizes.AppendElement(mSize); + } else { + aNativeSizes = mNativeSizes; + } + + return NS_OK; +} + //****************************************************************************** NS_IMETHODIMP RasterImage::GetIntrinsicSize(nsSize* aSize) @@ -703,6 +721,7 @@ RasterImage::SetMetadata(const ImageMetadata& aMetadata, // Set the size and flag that we have it. mSize = size; mOrientation = orientation; + mNativeSizes = aMetadata.GetNativeSizes(); mHasSize = true; } diff --git a/image/RasterImage.h b/image/RasterImage.h index 09fa18b4df655..023985669a7a7 100644 --- a/image/RasterImage.h +++ b/image/RasterImage.h @@ -160,6 +160,7 @@ class RasterImage final : public ImageResource NS_DECL_IMGICONTAINERDEBUG #endif + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual nsresult StartAnimation() override; virtual nsresult StopAnimation() override; @@ -380,6 +381,7 @@ class RasterImage final : public ImageResource private: // data nsIntSize mSize; + nsTArray mNativeSizes; Orientation mOrientation; /// If this has a value, we're waiting for SetSize() to send the load event. diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index fa3ecb8bc049a..7c650fc7545ca 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -520,6 +520,13 @@ VectorImage::GetWidth(int32_t* aWidth) return NS_OK; } +//****************************************************************************** +nsresult +VectorImage::GetNativeSizes(nsTArray& aNativeSizes) const +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + //****************************************************************************** NS_IMETHODIMP_(void) VectorImage::RequestRefresh(const TimeStamp& aTime) diff --git a/image/VectorImage.h b/image/VectorImage.h index cb55e057753cd..a05c92f3cf380 100644 --- a/image/VectorImage.h +++ b/image/VectorImage.h @@ -34,6 +34,7 @@ class VectorImage final : public ImageResource, // (no public constructor - use ImageFactory) // Methods inherited from Image + nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual size_t SizeOfSourceWithComputedFallback(MallocSizeOf aMallocSizeOf) const override; virtual void CollectSizeOfSurfaces(nsTArray& aCounters, diff --git a/image/decoders/nsICODecoder.cpp b/image/decoders/nsICODecoder.cpp index 85b3c139b0d78..d8171431ea837 100644 --- a/image/decoders/nsICODecoder.cpp +++ b/image/decoders/nsICODecoder.cpp @@ -242,6 +242,8 @@ nsICODecoder::ReadDirEntry(const char* aData) } } + mImageMetadata.AddNativeSize(entrySize); + if (desiredSize) { // Calculate the delta between this resource's size and the desired size, so // we can see if it is better than our current-best option. In the case of diff --git a/image/imgFrame.h b/image/imgFrame.h index 77ff3507b1771..bd858e088dcff 100644 --- a/image/imgFrame.h +++ b/image/imgFrame.h @@ -11,6 +11,7 @@ #include "mozilla/MemoryReporting.h" #include "mozilla/Monitor.h" #include "mozilla/Move.h" +#include "FrameTimeout.h" #include "gfxDrawable.h" #include "imgIContainer.h" #include "MainThreadUtils.h" @@ -46,106 +47,6 @@ enum class Opacity : uint8_t { SOME_TRANSPARENCY }; -/** - * FrameTimeout wraps a frame timeout value (measured in milliseconds) after - * first normalizing it. This normalization is necessary because some tools - * generate incorrect frame timeout values which we nevertheless have to - * support. For this reason, code that deals with frame timeouts should always - * use a FrameTimeout value rather than the raw value from the image header. - */ -struct FrameTimeout -{ - /** - * @return a FrameTimeout of zero. This should be used only for math - * involving FrameTimeout values. You can't obtain a zero FrameTimeout from - * FromRawMilliseconds(). - */ - static FrameTimeout Zero() { return FrameTimeout(0); } - - /// @return an infinite FrameTimeout. - static FrameTimeout Forever() { return FrameTimeout(-1); } - - /// @return a FrameTimeout obtained by normalizing a raw timeout value. - static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) - { - // Normalize all infinite timeouts to the same value. - if (aRawMilliseconds < 0) { - return FrameTimeout::Forever(); - } - - // Very small timeout values are problematic for two reasons: we don't want - // to burn energy redrawing animated images extremely fast, and broken tools - // generate these values when they actually want a "default" value, so such - // images won't play back right without normalization. For some context, - // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical - // behavior of IE and Opera was: - // IE 6/Win: - // 10 - 50ms is normalized to 100ms. - // >50ms is used unnormalized. - // Opera 7 final/Win: - // 10ms is normalized to 100ms. - // >10ms is used unnormalized. - if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { - return FrameTimeout(100); - } - - // The provided timeout value is OK as-is. - return FrameTimeout(aRawMilliseconds); - } - - bool operator==(const FrameTimeout& aOther) const - { - return mTimeout == aOther.mTimeout; - } - - bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } - - FrameTimeout operator+(const FrameTimeout& aOther) - { - if (*this == Forever() || aOther == Forever()) { - return Forever(); - } - - return FrameTimeout(mTimeout + aOther.mTimeout); - } - - FrameTimeout& operator+=(const FrameTimeout& aOther) - { - *this = *this + aOther; - return *this; - } - - /** - * @return this FrameTimeout's value in milliseconds. Illegal to call on a - * an infinite FrameTimeout value. - */ - uint32_t AsMilliseconds() const - { - if (*this == Forever()) { - MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); - return 100; // Fail to something sane. - } - - return uint32_t(mTimeout); - } - - /** - * @return this FrameTimeout value encoded so that non-negative values - * represent a timeout in milliseconds, and -1 represents an infinite - * timeout. - * - * XXX(seth): This is a backwards compatibility hack that should be removed. - */ - int32_t AsEncodedValueDeprecated() const { return mTimeout; } - -private: - explicit FrameTimeout(int32_t aTimeout) - : mTimeout(aTimeout) - { } - - int32_t mTimeout; -}; - /** * AnimationData contains all of the information necessary for using an imgFrame * as part of an animation. diff --git a/image/imgIContainer.idl b/image/imgIContainer.idl index 640eae3525587..eed28e2668d96 100644 --- a/image/imgIContainer.idl +++ b/image/imgIContainer.idl @@ -90,6 +90,10 @@ interface imgIContainer : nsISupports */ readonly attribute int32_t height; + %{C++ + virtual nsresult GetNativeSizes(nsTArray& aNativeSizes) const = 0; + %} + /** * The intrinsic size of this image in appunits. If the image has no intrinsic * size in a dimension, -1 will be returned for that dimension. In the case of diff --git a/image/moz.build b/image/moz.build index c3a3a610fd8e9..8ccb30247e91d 100644 --- a/image/moz.build +++ b/image/moz.build @@ -37,8 +37,10 @@ XPIDL_MODULE = 'imglib2' EXPORTS += [ 'DrawResult.h', + 'FrameTimeout.h', 'ImageCacheKey.h', 'ImageLogging.h', + 'ImageMetadata.h', 'ImageOps.h', 'ImageRegion.h', 'imgLoader.h', diff --git a/image/test/gtest/Common.cpp b/image/test/gtest/Common.cpp index 4be34461c71ca..4bc7fce1c32e3 100644 --- a/image/test/gtest/Common.cpp +++ b/image/test/gtest/Common.cpp @@ -679,5 +679,11 @@ ImageTestCase TruncatedSmallGIFTestCase() return ImageTestCase("green-1x1-truncated.gif", "image/gif", IntSize(1, 1)); } +ImageTestCase GreenMultipleSizesICOTestCase() +{ + return ImageTestCase("green-multiple-sizes.ico", "image/x-icon", + IntSize(256, 256)); +} + } // namespace image } // namespace mozilla diff --git a/image/test/gtest/Common.h b/image/test/gtest/Common.h index 33fc26e750f82..63b8b9b700262 100644 --- a/image/test/gtest/Common.h +++ b/image/test/gtest/Common.h @@ -414,6 +414,8 @@ ImageTestCase DownscaledTransparentICOWithANDMaskTestCase(); ImageTestCase TruncatedSmallGIFTestCase(); +ImageTestCase GreenMultipleSizesICOTestCase(); + } // namespace image } // namespace mozilla diff --git a/image/test/gtest/TestDecodeToSurface.cpp b/image/test/gtest/TestDecodeToSurface.cpp index dd22d4308d9b1..f5762d84c1723 100644 --- a/image/test/gtest/TestDecodeToSurface.cpp +++ b/image/test/gtest/TestDecodeToSurface.cpp @@ -27,9 +27,11 @@ class DecodeToSurfaceRunnable : public Runnable public: DecodeToSurfaceRunnable(RefPtr& aSurface, nsIInputStream* aInputStream, + ImageOps::ImageBuffer* aImageBuffer, const ImageTestCase& aTestCase) : mSurface(aSurface) , mInputStream(aInputStream) + , mImageBuffer(aImageBuffer) , mTestCase(aTestCase) { } @@ -41,16 +43,35 @@ class DecodeToSurfaceRunnable : public Runnable void Go() { - mSurface = - ImageOps::DecodeToSurface(mInputStream, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT); + Maybe outputSize; + if (mTestCase.mOutputSize != mTestCase.mSize) { + outputSize.emplace(mTestCase.mOutputSize); + } + + if (mImageBuffer) { + mSurface = + ImageOps::DecodeToSurface(mImageBuffer, + nsDependentCString(mTestCase.mMimeType), + imgIContainer::DECODE_FLAGS_DEFAULT, + outputSize); + } else { + mSurface = + ImageOps::DecodeToSurface(mInputStream, + nsDependentCString(mTestCase.mMimeType), + imgIContainer::DECODE_FLAGS_DEFAULT, + outputSize); + } ASSERT_TRUE(mSurface != nullptr); EXPECT_TRUE(mSurface->IsDataSourceSurface()); EXPECT_TRUE(mSurface->GetFormat() == SurfaceFormat::B8G8R8X8 || mSurface->GetFormat() == SurfaceFormat::B8G8R8A8); - EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); + + if (outputSize) { + EXPECT_EQ(*outputSize, mSurface->GetSize()); + } else { + EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); + } EXPECT_TRUE(IsSolidColor(mSurface, BGRAColor::Green(), mTestCase.mFlags & TEST_CASE_IS_FUZZY ? 1 : 0)); @@ -59,14 +80,19 @@ class DecodeToSurfaceRunnable : public Runnable private: RefPtr& mSurface; nsCOMPtr mInputStream; + RefPtr mImageBuffer; ImageTestCase mTestCase; }; static void -RunDecodeToSurface(const ImageTestCase& aTestCase) +RunDecodeToSurface(const ImageTestCase& aTestCase, + ImageOps::ImageBuffer* aImageBuffer = nullptr) { - nsCOMPtr inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); + nsCOMPtr inputStream; + if (!aImageBuffer) { + inputStream = LoadFile(aTestCase.mPath); + ASSERT_TRUE(inputStream != nullptr); + } nsCOMPtr thread; nsresult rv = @@ -77,7 +103,7 @@ RunDecodeToSurface(const ImageTestCase& aTestCase) // DecodeToSurface doesn't require any main-thread-only code. RefPtr surface; nsCOMPtr runnable = - new DecodeToSurfaceRunnable(surface, inputStream, aTestCase); + new DecodeToSurfaceRunnable(surface, inputStream, aImageBuffer, aTestCase); thread->Dispatch(runnable, nsIThread::DISPATCH_SYNC); thread->Shutdown(); @@ -122,3 +148,43 @@ TEST_F(ImageDecodeToSurface, Corrupt) imgIContainer::DECODE_FLAGS_DEFAULT); EXPECT_TRUE(surface == nullptr); } + +TEST_F(ImageDecodeToSurface, ICOMultipleSizes) +{ + ImageTestCase testCase = GreenMultipleSizesICOTestCase(); + + nsCOMPtr inputStream = LoadFile(testCase.mPath); + ASSERT_TRUE(inputStream != nullptr); + + RefPtr buffer = + ImageOps::CreateImageBuffer(inputStream); + ASSERT_TRUE(buffer != nullptr); + + ImageMetadata metadata; + nsresult rv = ImageOps::DecodeMetadata(buffer, + nsDependentCString(testCase.mMimeType), + metadata); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_TRUE(metadata.HasSize()); + EXPECT_EQ(testCase.mSize, metadata.GetSize()); + + const nsTArray& nativeSizes = metadata.GetNativeSizes(); + ASSERT_EQ(6u, nativeSizes.Length()); + + IntSize expectedSizes[] = { + IntSize(16, 16), + IntSize(32, 32), + IntSize(64, 64), + IntSize(128, 128), + IntSize(256, 256), + IntSize(256, 128), + }; + + for (int i = 0; i < 6; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + + // Request decoding at native size + testCase.mOutputSize = nativeSizes[i]; + RunDecodeToSurface(testCase, buffer); + } +} diff --git a/image/test/gtest/TestDecoders.cpp b/image/test/gtest/TestDecoders.cpp index d39b8e404a60f..16b17ac63b3f8 100644 --- a/image/test/gtest/TestDecoders.cpp +++ b/image/test/gtest/TestDecoders.cpp @@ -672,3 +672,87 @@ TEST_F(ImageDecoders, TruncatedSmallGIFSingleChunk) { CheckDecoderSingleChunk(TruncatedSmallGIFTestCase()); } + +TEST_F(ImageDecoders, MultipleSizesICOSingleChunk) +{ + ImageTestCase testCase = GreenMultipleSizesICOTestCase(); + + // Create an image. + RefPtr image = + ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); + ASSERT_TRUE(!image->HasError()); + + nsCOMPtr inputStream = LoadFile(testCase.mPath); + ASSERT_TRUE(inputStream); + + // Figure out how much data we have. + uint64_t length; + nsresult rv = inputStream->Available(&length); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + // Write the data into the image. + rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, + static_cast(length)); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + // Let the image know we've sent all the data. + rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); + ASSERT_TRUE(NS_SUCCEEDED(rv)); + + RefPtr tracker = image->GetProgressTracker(); + tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); + + // Use GetFrame() to force a sync decode of the image. + RefPtr surface = + image->GetFrame(imgIContainer::FRAME_CURRENT, + imgIContainer::FLAG_SYNC_DECODE); + + // Ensure that the image's metadata meets our expectations. + IntSize imageSize(0, 0); + rv = image->GetWidth(&imageSize.width); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + rv = image->GetHeight(&imageSize.height); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + + EXPECT_EQ(testCase.mSize.width, imageSize.width); + EXPECT_EQ(testCase.mSize.height, imageSize.height); + + nsTArray nativeSizes; + rv = image->GetNativeSizes(nativeSizes); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_EQ(6u, nativeSizes.Length()); + + IntSize expectedSizes[] = { + IntSize(16, 16), + IntSize(32, 32), + IntSize(64, 64), + IntSize(128, 128), + IntSize(256, 256), + IntSize(256, 128) + }; + + for (int i = 0; i < 6; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + } + + RefPtr image90 = + ImageOps::Orient(image, Orientation(Angle::D90, Flip::Unflipped)); + rv = image90->GetNativeSizes(nativeSizes); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_EQ(6u, nativeSizes.Length()); + + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + } + EXPECT_EQ(IntSize(128, 256), nativeSizes[5]); + + RefPtr image180 = + ImageOps::Orient(image, Orientation(Angle::D180, Flip::Unflipped)); + rv = image180->GetNativeSizes(nativeSizes); + EXPECT_TRUE(NS_SUCCEEDED(rv)); + ASSERT_EQ(6u, nativeSizes.Length()); + + for (int i = 0; i < 6; ++i) { + EXPECT_EQ(expectedSizes[i], nativeSizes[i]); + } +} diff --git a/image/test/gtest/green-multiple-sizes.ico b/image/test/gtest/green-multiple-sizes.ico new file mode 100644 index 0000000000000000000000000000000000000000..b9463d0c897117204b2edacfa6cbfc4f5f61d771 GIT binary patch literal 14144 zcmeI$u}Z^09LMorsuU?iGF5aj4uYeb;1s1*3sS3eaC9mnh?}dy&3ACb06tZ(!iOf<#;`kn$9d6k7uQwnw00` zaUxyT{R2m&RA=t*nr^D^Qz==H);#5cg;n_hP}ZY(wYf8)+x>!>Ikgv!B;X9iE3tM2N({eIg8WY>=`o{tYb zv)pNI^-teFUZdEfx8di(`TWMvmqon9E8ga6@%BCpJMC`kVf*AdR5C+V;zwm7l&;4? wWulUxM*sl?5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0;O_{00SHw$wg3PC literal 0 HcmV?d00001 diff --git a/image/test/gtest/moz.build b/image/test/gtest/moz.build index ad69e098518cd..3e37573dba045 100644 --- a/image/test/gtest/moz.build +++ b/image/test/gtest/moz.build @@ -47,6 +47,7 @@ TEST_HARNESS_FILES.gtest += [ 'first-frame-green.png', 'first-frame-padding.gif', 'green-1x1-truncated.gif', + 'green-multiple-sizes.ico', 'green.bmp', 'green.gif', 'green.ico', From 6600070bf614cf1224dad665935a9494c0735197 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Wed, 22 Mar 2017 15:46:17 +0100 Subject: [PATCH 256/300] Bug 1331058 - Add testcase. r=me --- js/src/jit-test/tests/ion/bug1331058.js | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 js/src/jit-test/tests/ion/bug1331058.js diff --git a/js/src/jit-test/tests/ion/bug1331058.js b/js/src/jit-test/tests/ion/bug1331058.js new file mode 100644 index 0000000000000..ffb8f29196d55 --- /dev/null +++ b/js/src/jit-test/tests/ion/bug1331058.js @@ -0,0 +1,29 @@ +function foo(o, trigger) { + bar = function() { return o.getY(); }; + if (trigger) + assertEq(bar(), undefined); + return 1; +} +function O(o, trigger) { + this.a1 = 1; + this.a2 = 2; + this.a3 = 3; + this.a4 = 4; + this.x = foo(this, trigger); +} +O.prototype.getY = function() { + return this.x; +} +function test() { + with(this) {}; // No Ion. + var arr = []; + for (var i=0; i<100; i++) + arr.push(new O({y: i}, false)); + + for (var i=0; i<100; i++) + bar(); + + for (var i=0; i<300; i++) + arr.push(new O({y: i}, true)); +} +test(); From 9256d871e5d57387124d78e39835fd8d0c9b7d6f Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Wed, 22 Mar 2017 15:47:21 +0100 Subject: [PATCH 257/300] Bug 1346140 - Flatten external strings when creating dependent strings. r=jwalden,h4writer --- js/src/jit/CodeGenerator.cpp | 7 ++----- js/src/jit/MacroAssembler-inl.h | 13 +++++++++++++ js/src/jit/MacroAssembler.h | 1 + js/src/vm/String-inl.h | 3 +++ js/src/vm/String.cpp | 6 ++++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp index 461e0d46e6532..240ed55f0ab13 100644 --- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -1206,7 +1206,7 @@ PrepareAndExecuteRegExp(JSContext* cx, MacroAssembler& masm, Register regexp, Re } // Check for a linear input string. - masm.branchIfRope(input, failure); + masm.branchIfRopeOrExternal(input, temp1, failure); // Get the RegExpShared for the RegExp. masm.loadPtr(Address(regexp, NativeObject::getFixedSlotOffset(RegExpObject::PRIVATE_SLOT)), temp1); @@ -7608,10 +7608,7 @@ CodeGenerator::visitSubstr(LSubstr* lir) // Use slow path for ropes. masm.bind(&nonZero); - static_assert(JSString::ROPE_FLAGS == 0, - "rope flags must be zero for (flags & TYPE_FLAGS_MASK) == 0 " - "to be a valid is-rope check"); - masm.branchTest32(Assembler::Zero, stringFlags, Imm32(JSString::TYPE_FLAGS_MASK), slowPath); + masm.branchIfRopeOrExternal(string, temp, slowPath); // Handle inlined strings by creating a FatInlineString. masm.branchTest32(Assembler::Zero, stringFlags, Imm32(JSString::INLINE_CHARS_BIT), ¬Inline); diff --git a/js/src/jit/MacroAssembler-inl.h b/js/src/jit/MacroAssembler-inl.h index d089c32f2295a..edca338fab0ec 100644 --- a/js/src/jit/MacroAssembler-inl.h +++ b/js/src/jit/MacroAssembler-inl.h @@ -395,6 +395,19 @@ MacroAssembler::branchIfRope(Register str, Label* label) branchTest32(Assembler::Zero, flags, Imm32(JSString::TYPE_FLAGS_MASK), label); } +void +MacroAssembler::branchIfRopeOrExternal(Register str, Register temp, Label* label) +{ + Address flags(str, JSString::offsetOfFlags()); + move32(Imm32(JSString::TYPE_FLAGS_MASK), temp); + and32(flags, temp); + + static_assert(JSString::ROPE_FLAGS == 0, "Rope type flags must be 0"); + branchTest32(Assembler::Zero, temp, temp, label); + + branch32(Assembler::Equal, temp, Imm32(JSString::EXTERNAL_FLAGS), label); +} + void MacroAssembler::branchLatin1String(Register string, Label* label) { diff --git a/js/src/jit/MacroAssembler.h b/js/src/jit/MacroAssembler.h index e6189bde6e010..2a0d8faefdf83 100644 --- a/js/src/jit/MacroAssembler.h +++ b/js/src/jit/MacroAssembler.h @@ -1113,6 +1113,7 @@ class MacroAssembler : public MacroAssemblerSpecific inline void branchIfTrueBool(Register reg, Label* label); inline void branchIfRope(Register str, Label* label); + inline void branchIfRopeOrExternal(Register str, Register temp, Label* label); inline void branchLatin1String(Register string, Label* label); inline void branchTwoByteString(Register string, Label* label); diff --git a/js/src/vm/String-inl.h b/js/src/vm/String-inl.h index 7dc628d02117c..ff98dcc1d3196 100644 --- a/js/src/vm/String-inl.h +++ b/js/src/vm/String-inl.h @@ -181,6 +181,9 @@ JSDependentString::new_(JSContext* cx, JSLinearString* baseArg, size_t start, : js::NewInlineString(cx, base, start, length); } + if (baseArg->isExternal() && !baseArg->ensureFlat(cx)) + return nullptr; + JSDependentString* str = static_cast(js::Allocate(cx)); if (str) { str->init(cx, baseArg, start, length); diff --git a/js/src/vm/String.cpp b/js/src/vm/String.cpp index 4a1ec1d3f9dc4..67ddee95ca013 100644 --- a/js/src/vm/String.cpp +++ b/js/src/vm/String.cpp @@ -928,6 +928,9 @@ AutoStableStringChars::init(JSContext* cx, JSString* s) MOZ_ASSERT(state_ == Uninitialized); + if (linearString->isExternal() && !linearString->ensureFlat(cx)) + return false; + // If the chars are inline then we need to copy them since they may be moved // by a compacting GC. if (baseIsInline(linearString)) { @@ -959,6 +962,9 @@ AutoStableStringChars::initTwoByte(JSContext* cx, JSString* s) if (linearString->hasLatin1Chars()) return copyAndInflateLatin1Chars(cx, linearString); + if (linearString->isExternal() && !linearString->ensureFlat(cx)) + return false; + // If the chars are inline then we need to copy them since they may be moved // by a compacting GC. if (baseIsInline(linearString)) From 5eeefcee8f459b7911e1ed330d0658e69c4e5b34 Mon Sep 17 00:00:00 2001 From: ffxbld <> Date: Wed, 22 Mar 2017 07:50:16 -0700 Subject: [PATCH 258/300] No bug, Automated HSTS preload list update from host bld-linux64-spot-388 - a=hsts-update --- security/manager/ssl/nsSTSPreloadList.errors | 222 +- security/manager/ssl/nsSTSPreloadList.inc | 34432 +++++++++-------- 2 files changed, 17327 insertions(+), 17327 deletions(-) diff --git a/security/manager/ssl/nsSTSPreloadList.errors b/security/manager/ssl/nsSTSPreloadList.errors index b995762330ae6..e545dfa12b572 100644 --- a/security/manager/ssl/nsSTSPreloadList.errors +++ b/security/manager/ssl/nsSTSPreloadList.errors @@ -3,13 +3,14 @@ 020wifi.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] 0g.org.uk: could not connect to host 0p.no: did not receive HSTS header +0x.cx: could not connect to host 0x0a.net: could not connect to host 0x1337.eu: could not connect to host 0x44.net: did not receive HSTS header 0xa.in: could not connect to host -0xacab.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] 0xb612.org: could not connect to host 0xf00.ch: did not receive HSTS header +1000serien.com: could not connect to host 100dayloans.com: max-age too low: 0 1018hosting.nl: did not receive HSTS header 1022996493.rsc.cdn77.org: could not connect to host @@ -31,7 +32,6 @@ 247loan.com: max-age too low: 0 24hourpaint.com: could not connect to host 25daysof.io: could not connect to host -263.info: could not connect to host 2859cc.com: could not connect to host 2brokegirls.org: could not connect to host 2intermediate.co.uk: did not receive HSTS header @@ -65,11 +65,10 @@ 4sqsu.eu: could not connect to host 4w-performers.link: could not connect to host 50millionablaze.org: could not connect to host -525.info: could not connect to host 540.co: did not receive HSTS header 56ct.com: could not connect to host 60ych.net: did not receive HSTS header -6120.eu: could not connect to host +6120.eu: did not receive HSTS header 69square.com: could not connect to host 7kovrikov.ru: did not receive HSTS header 808.lv: did not receive HSTS header @@ -95,13 +94,13 @@ abilitylist.org: did not receive HSTS header abioniere.de: could not connect to host abnarnro.com: could not connect to host abolitionistsociety.com: could not connect to host +about.ge: did not receive HSTS header aboutmyip.info: did not receive HSTS header aboutmyproperty.ca: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] aboutyou-deals.de: did not receive HSTS header abtom.de: did not receive HSTS header abury.fr: did not receive HSTS header abury.me: did not receive HSTS header -accelerateyourworld.org: could not connect to host accelerole.com: did not receive HSTS header accountradar.com: could not connect to host accounts-p.com: could not connect to host @@ -124,7 +123,6 @@ adajwells.me: could not connect to host adams.net: max-age too low: 0 adamwk.com: did not receive HSTS header addaxpetroleum.com: could not connect to host -adduono.com: could not connect to host addvocate.com: could not connect to host adelevie.com: could not connect to host adequatetechnology.com: could not connect to host @@ -154,7 +152,6 @@ aether.pw: could not connect to host aevpn.net: could not connect to host aficotroceni.ro: did not receive HSTS header afp548.tk: could not connect to host -afrodigital.uk: did not receive HSTS header afyou.co.kr: could not connect to host agalaxyfarfaraway.co.uk: could not connect to host agbremen.de: did not receive HSTS header @@ -165,7 +162,9 @@ agro-id.gov.ua: could not connect to host ahabingo.com: did not receive HSTS header ahoynetwork.com: did not receive HSTS header ahri.ovh: could not connect to host +ahughes03.com: did not receive HSTS header aidanwoods.com: did not receive HSTS header +aiois.com: could not connect to host airbnb.com: did not receive HSTS header aircomms.com: did not receive HSTS header airproto.com: could not connect to host @@ -199,7 +198,7 @@ alittlebitcheeky.com: did not receive HSTS header aljaspod.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] alkami.com: did not receive HSTS header all-subtitles.com: did not receive HSTS header -all.tf: did not receive HSTS header +all.tf: could not connect to host alldaymonitoring.com: could not connect to host allforyou.at: could not connect to host allinnote.com: could not connect to host @@ -241,8 +240,8 @@ andiplusben.com: could not connect to host andreasbreitenlohner.de: did not receive HSTS header andreastoneman.com: could not connect to host andreigec.net: did not receive HSTS header +andrew.london: did not receive HSTS header andrewbroekman.com: could not connect to host -andrewhowden.com: did not receive HSTS header andrewmichaud.beer: could not connect to host andrewregan.me: could not connect to host andreypopp.com: could not connect to host @@ -266,6 +265,8 @@ ankaraprofesyonelnakliyat.com.tr: did not receive HSTS header annabellaw.com: max-age too low: 0 anomaly.ws: did not receive HSTS header anonboards.com: did not receive HSTS header +anonymo.co.uk: could not connect to host +anonymo.uk: could not connect to host anonymousstatecollegelulzsec.com: could not connect to host anook.com: max-age too low: 0 another.ch: could not connect to host @@ -279,6 +280,7 @@ antoniorequena.com.ve: could not connect to host antscript.com: did not receive HSTS header anycoin.me: could not connect to host aocast.info: could not connect to host +aosc.io: did not receive HSTS header apachelounge.com: did not receive HSTS header aparaatti.org: could not connect to host apeasternpower.com: could not connect to host @@ -304,7 +306,6 @@ apps-for-fishing.com: could not connect to host appsdash.io: could not connect to host appseccalifornia.org: did not receive HSTS header aptive.co.uk: did not receive HSTS header -aqualogy.de: could not connect to host aquilalab.com: could not connect to host arabdigitalexpression.org: did not receive HSTS header aradulconteaza.ro: could not connect to host @@ -332,7 +333,6 @@ arvamus.eu: could not connect to host arzaroth.com: did not receive HSTS header as.se: could not connect to host as9178.net: could not connect to host -asadzulfahri.com: could not connect to host asasuou.pw: could not connect to host asc16.com: could not connect to host ascamso.com: could not connect to host @@ -362,7 +362,6 @@ atbeckett.com: did not receive HSTS header athaliasoft.com: could not connect to host athenelive.com: could not connect to host athul.xyz: did not receive HSTS header -atlas.co: max-age too low: 0 atlex.nl: did not receive HSTS header atomik.pro: could not connect to host atop.io: could not connect to host @@ -382,6 +381,7 @@ ausnah.me: could not connect to host ausoptic.com.au: max-age too low: 2592000 auth.mail.ru: did not receive HSTS header authentication.io: could not connect to host +authint.com: could not connect to host authoritynutrition.com: did not receive HSTS header auto-serwis.zgorzelec.pl: did not receive HSTS header auto4trade.nl: could not connect to host @@ -393,7 +393,6 @@ autotsum.com: could not connect to host autumnwindsagility.com: could not connect to host auverbox.ovh: could not connect to host auxiliumincrementum.co.uk: could not connect to host -av.de: did not receive HSTS header avec-ou-sans-ordonnance.fr: could not connect to host avenelequinehospital.com.au: did not receive HSTS header avenueeyecare.com: could not connect to host @@ -425,7 +424,6 @@ back-bone.nl: did not receive HSTS header badcronjob.com: could not connect to host badenhard.eu: could not connect to host badkamergigant.com: could not connect to host -badlink.org: could not connect to host baff.lu: did not receive HSTS header baiduaccount.com: could not connect to host bakingstone.com: could not connect to host @@ -451,6 +449,7 @@ baum.ga: did not receive HSTS header baumstark.ca: could not connect to host baysse.eu: could not connect to host bazarstupava.sk: could not connect to host +bbb1991.me: could not connect to host bcbsmagentprofile.com: could not connect to host bcchack.com: could not connect to host bccx.com: could not connect to host @@ -465,7 +464,6 @@ be.search.yahoo.com: did not receive HSTS header beach-inspector.com: did not receive HSTS header beachi.es: could not connect to host beaglewatch.com: could not connect to host -beamitapp.com: could not connect to host beardydave.com: did not receive HSTS header beastowner.com: did not receive HSTS header beavers.io: could not connect to host @@ -500,7 +498,6 @@ betcafearena.ro: did not receive HSTS header betnet.fr: could not connect to host betplanning.it: did not receive HSTS header bets.de: did not receive HSTS header -betterlifemakers.com: could not connect to host bettween.com: could not connect to host betz.ro: did not receive HSTS header bevapehappy.com: did not receive HSTS header @@ -620,6 +617,7 @@ bouwbedrijfpurmerend.nl: did not receive HSTS header bowlroll.net: max-age too low: 0 boxcryptor.com: did not receive HSTS header br3in.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] +brage.info: did not receive HSTS header braineet.com: did not receive HSTS header brainfork.ml: could not connect to host braintreegateway.com: did not receive HSTS header @@ -637,14 +635,13 @@ bregnedalsystems.dk: did not receive HSTS header brettabel.com: did not receive HSTS header brickoo.com: could not connect to host bridholm.se: could not connect to host -britzer-toner.de: did not receive HSTS header +britzer-toner.de: could not connect to host brks.xyz: could not connect to host broken-oak.com: could not connect to host brookechase.com: did not receive HSTS header browserid.org: did not receive HSTS header brunix.net: did not receive HSTS header brunosouza.org: could not connect to host -bryn.xyz: could not connect to host bsagan.fr: could not connect to host bsdtips.com: could not connect to host bsquared.org: could not connect to host @@ -660,7 +657,6 @@ buildify.co.za: could not connect to host buildsaver.co.za: did not receive HSTS header built.by: did not receive HSTS header bulletpoint.cz: could not connect to host -bulmafox.com: could not connect to host bumarkamoda.com: could not connect to host bunaken.asia: could not connect to host burian-server.cz: could not connect to host @@ -694,7 +690,7 @@ byte.wtf: did not receive HSTS header bytema.re: could not connect to host bytepark.de: did not receive HSTS header bytesund.biz: could not connect to host -bytesystems.com: could not connect to host +bziaks.xyz: could not connect to host c1yd3i.me: could not connect to host c3b.info: could not connect to host cabarave.com: could not connect to host @@ -731,6 +727,7 @@ capturethepen.co.uk: could not connect to host car-navi.ph: did not receive HSTS header carano-service.de: did not receive HSTS header caraudio69.cz: could not connect to host +carboneselectricosnettosl.info: max-age too low: 0 carck.co.uk: did not receive HSTS header cardoni.net: did not receive HSTS header cardstream.com: did not receive HSTS header @@ -783,9 +780,7 @@ cfetengineering.com: could not connect to host cfoitplaybook.com: could not connect to host cg.search.yahoo.com: did not receive HSTS header cganx.org: could not connect to host -chahub.com: could not connect to host chainmonitor.com: could not connect to host -chalkfestival.org: could not connect to host championsofregnum.com: did not receive HSTS header champserver.net: did not receive HSTS header chandlerredding.com: did not receive HSTS header @@ -801,7 +796,6 @@ chatbot.me: did not receive HSTS header chateauconstellation.ch: did not receive HSTS header chatme.im: did not receive HSTS header chatup.cf: could not connect to host -chatxp.com: did not receive HSTS header chaulootz.com: could not connect to host chcemvediet.sk: max-age too low: 1555200 cheapdns.org: could not connect to host @@ -826,7 +820,6 @@ chotu.net: could not connect to host chris-web.info: could not connect to host chrisandsarahinasia.com: did not receive HSTS header chrisfaber.com: could not connect to host -chrishamper.com: could not connect to host chriskyrouac.com: could not connect to host christiaandruif.nl: could not connect to host christianbargon.de: did not receive HSTS header @@ -849,11 +842,11 @@ ciplanutrition.com: did not receive HSTS header ciscommerce.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] citiagent.cz: could not connect to host cityoflaurel.org: did not receive HSTS header +cium.ru: could not connect to host clara-baumert.de: could not connect to host classicsandexotics.com: did not receive HSTS header classicspublishing.com: could not connect to host clcleaningco.com: could not connect to host -cldly.com: could not connect to host cleanexperts.co.uk: could not connect to host cleaningsquad.ca: max-age too low: 0 cleanmta.com: could not connect to host @@ -875,6 +868,7 @@ cloudcy.net: could not connect to host clouddesktop.co.nz: could not connect to host cloudey.net: did not receive HSTS header cloudflare.com: did not receive HSTS header +cloudily.com: could not connect to host cloudimag.es: could not connect to host cloudlink.club: could not connect to host cloudns.com.au: could not connect to host @@ -902,7 +896,7 @@ cni-certing.it: max-age too low: 0 co50.com: did not receive HSTS header cobrasystems.nl: max-age too low: 0 cocaine-import.agency: could not connect to host -cockedey.in: could not connect to host +cockedey.in: did not receive HSTS header cocktailfuture.fr: could not connect to host codabix.com: did not receive HSTS header codabix.de: could not connect to host @@ -916,17 +910,15 @@ codelayer.ca: could not connect to host codelitmus.com: did not receive HSTS header codemonkeyrawks.net: could not connect to host codepoet.de: could not connect to host +codepult.com: could not connect to host codepx.com: did not receive HSTS header -codewild.de: could not connect to host codewiththepros.org: could not connect to host codiva.io: max-age too low: 2592000 coffeeetc.co.uk: did not receive HSTS header coffeestrategies.com: max-age too low: 2592000 -coi-verify.com: could not connect to host coiffeurschnittstelle.ch: did not receive HSTS header coindam.com: could not connect to host coldlostsick.net: could not connect to host -collies.eu: did not receive HSTS header collins.kg: did not receive HSTS header collins.press: did not receive HSTS header colmexpro.com: did not receive HSTS header @@ -969,7 +961,6 @@ cordial-restaurant.com: did not receive HSTS header core.mx: could not connect to host core4system.de: could not connect to host corenetworking.de: could not connect to host -coreum.ca: could not connect to host cormactagging.ie: could not connect to host cormilu.com.br: did not receive HSTS header correctpaardbatterijnietje.nl: did not receive HSTS header @@ -995,6 +986,7 @@ crazifyngers.com: could not connect to host crazy-crawler.de: did not receive HSTS header crazycen.com: did not receive HSTS header crazyhotseeds.com: did not receive HSTS header +create-test-publish.co.uk: could not connect to host creativephysics.ml: could not connect to host creativeplayuk.com: did not receive HSTS header crendontech.com: could not connect to host @@ -1064,7 +1056,7 @@ dah5.com: did not receive HSTS header dailystormerpodcasts.com: did not receive HSTS header daimadi.com: could not connect to host dakrib.net: could not connect to host -daku.gdn: did not receive HSTS header +daku.gdn: could not connect to host dalfiume.it: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] dalingk.co: could not connect to host damedrogy.cz: could not connect to host @@ -1087,7 +1079,6 @@ darkkeepers.dk: did not receive HSTS header darknebula.space: could not connect to host darkpony.ru: could not connect to host darksideof.it: could not connect to host -darkstance.org: could not connect to host darrenellis.xyz: could not connect to host dashburst.com: did not receive HSTS header dashnimorad.com: did not receive HSTS header @@ -1146,6 +1137,7 @@ delvj.org: could not connect to host demdis.org: could not connect to host demilitarized.ninja: could not connect to host democracychronicles.com: did not receive HSTS header +demomanca.com: could not connect to host demotops.com: did not receive HSTS header dengyong.org: could not connect to host denh.am: did not receive HSTS header @@ -1171,13 +1163,12 @@ deuxvia.com: could not connect to host devafterdark.com: could not connect to host devcu.com: could not connect to host devcu.net: could not connect to host -devdoodle.net: could not connect to host devincrow.me: could not connect to host devnsec.com: could not connect to host devopps.me: did not receive HSTS header devtub.com: did not receive HSTS header devuan.org: did not receive HSTS header -dewin.io: did not receive HSTS header +dewin.io: could not connect to host dhome.at: did not receive HSTS header dhpcs.com: did not receive HSTS header dhpiggott.net: did not receive HSTS header @@ -1199,6 +1190,7 @@ digitalskillswap.com: could not connect to host dim.lighting: could not connect to host dinamoelektrik.com: max-age too low: 0 dinkum.online: could not connect to host +directhskincream.com: could not connect to host discoveringdocker.com: did not receive HSTS header discovery.lookout.com: did not receive HSTS header dislocated.de: did not receive HSTS header @@ -1268,9 +1260,9 @@ drakefortreasurer.sexy: could not connect to host draw.uy: could not connect to host drdevil.ru: could not connect to host dreadbyte.com: could not connect to host +dreamlighteyeserum.com: could not connect to host dreid.org: did not receive HSTS header dreizwosechs.de: could not connect to host -drewgle.net: could not connect to host drhopeson.com: could not connect to host drishti.guru: could not connect to host drkmtrx.xyz: could not connect to host @@ -1332,13 +1324,14 @@ edelsteincosmetic.com: did not receive HSTS header ediscomp.sk: did not receive HSTS header edissecurity.sk: did not receive HSTS header edix.ru: could not connect to host -edk.com.tr: could not connect to host +edk.com.tr: did not receive HSTS header edmodo.com: did not receive HSTS header edp-collaborative.com: max-age too low: 2500 eduvance.in: did not receive HSTS header effectiveosgi.com: could not connect to host efficienthealth.com: did not receive HSTS header effortlesshr.com: did not receive HSTS header +egbert.net: could not connect to host egg-ortho.ch: did not receive HSTS header egit.co: could not connect to host eglek.com: did not receive HSTS header @@ -1347,6 +1340,7 @@ ehito.ovh: could not connect to host ehrenamt-skpfcw.de: could not connect to host eicfood.com: could not connect to host eidolonhost.com: did not receive HSTS header +eipione.com: could not connect to host ekbanden.nl: could not connect to host elaintehtaat.fi: did not receive HSTS header elan-organics.com: did not receive HSTS header @@ -1397,6 +1391,7 @@ enginsight.com: did not receive HSTS header enigmacpt.com: did not receive HSTS header enigmail.net: did not receive HSTS header enjoy-nepal.de: max-age too low: 0 +enlightenment.org: did not receive HSTS header enskat.de: could not connect to host enskatson-sippe.de: could not connect to host enteente.club: could not connect to host @@ -1404,7 +1399,7 @@ enteente.space: could not connect to host enteente.xyz: could not connect to host enterdev.co: did not receive HSTS header enterprise-threat-monitor.com: max-age too low: 0 -entersynapse.com: could not connect to host +entersynapse.com: did not receive HSTS header entrepreneur.or.id: did not receive HSTS header enum.eu.org: could not connect to host enumify.com: could not connect to host @@ -1416,7 +1411,6 @@ ephry.com: could not connect to host epoxate.com: could not connect to host eq8.net.au: could not connect to host equilibre-yoga-jennifer-will.com: could not connect to host -equitee.co: could not connect to host erawanarifnugroho.com: did not receive HSTS header eressea.xyz: could not connect to host ericbond.net: could not connect to host @@ -1514,15 +1508,15 @@ familie-zimmermann.at: could not connect to host familjenm.se: could not connect to host fanyl.cn: could not connect to host farhadexchange.com: did not receive HSTS header +farhood.org: did not receive HSTS header fashioncare.cz: did not receive HSTS header fasset.jp: could not connect to host -fastcomcorp.com: could not connect to host -fastcomcorp.net: could not connect to host fastograph.com: could not connect to host fastopen.ml: could not connect to host fatgeekflix.net: could not connect to host fatherhood.gov: did not receive HSTS header fatlossguide.xyz: could not connect to host +fatox.de: could not connect to host fatwin.pw: could not connect to host fayolle.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] fbox.li: could not connect to host @@ -1538,21 +1532,19 @@ fenteo.com: could not connect to host feragon.net: did not receive HSTS header fernseher-kauf.de: could not connect to host ferrolatino.com: could not connect to host -festember.com: did not receive HSTS header +festember.com: could not connect to host festrip.com: could not connect to host fexmen.com: could not connect to host ffmradio.de: did not receive HSTS header fhdhelp.de: could not connect to host fhdhilft.de: could not connect to host fics-twosigma.com: did not receive HSTS header -fierman.us: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] fifieldtech.com: could not connect to host fiftyshadesofluca.ml: could not connect to host fig.co: did not receive HSTS header fightr.co: could not connect to host fikt.space: could not connect to host filemeal.com: did not receive HSTS header -filey.co.uk: could not connect to host filmipop.com: max-age too low: 0 finalgear.com: did not receive HSTS header financieringsportaal.nl: did not receive HSTS header @@ -1597,7 +1589,7 @@ flow.pe: could not connect to host flow.su: could not connect to host flowersandclouds.com: could not connect to host flowlo.me: could not connect to host -flukethoughts.com: could not connect to host +flucky.xyz: could not connect to host flushstudios.com: did not receive HSTS header flyaces.com: did not receive HSTS header fm83.nl: could not connect to host @@ -1729,13 +1721,12 @@ gatapro.net: could not connect to host gatilagata.com.br: did not receive HSTS header gatorsa.es: could not connect to host gdpventure.com: max-age too low: 0 -gdz-spishy.com: did not receive HSTS header -gdz.tv: did not receive HSTS header gedankenbude.info: could not connect to host geekcast.co.uk: did not receive HSTS header geeky.software: could not connect to host geli-graphics.com: did not receive HSTS header gem-indonesia.net: could not connect to host +gensonline.eu: could not connect to host genuu.com: could not connect to host genuxation.com: could not connect to host genyaa.com: could not connect to host @@ -1862,14 +1853,14 @@ greatnet.de: did not receive HSTS header greenhillantiques.co.uk: did not receive HSTS header greenvines.com.tw: did not receive HSTS header greg.red: could not connect to host -gregorytlee.me: did not receive HSTS header +gregorytlee.me: could not connect to host gremots.com: could not connect to host greplin.com: could not connect to host gresb.com: did not receive HSTS header gribani.com: could not connect to host grigalanzsoftware.com: could not connect to host gripopgriep.net: could not connect to host -groben-itsolutions.de: could not connect to host +groben-itsolutions.de: did not receive HSTS header groetzner.net: could not connect to host grossmann.gr: could not connect to host groups.google.com: did not receive HSTS header (error ignored - included regardless) @@ -1895,6 +1886,7 @@ gurom.lv: could not connect to host gurusupe.com: could not connect to host guso.gq: could not connect to host guso.ml: could not connect to host +guso.site: could not connect to host gussi.is: did not receive HSTS header gvt2.com: could not connect to host (error ignored - included regardless) gvt3.com: could not connect to host (error ignored - included regardless) @@ -1908,6 +1900,7 @@ gycis.me: could not connect to host gypthecat.com: max-age too low: 604800 gyz.io: could not connect to host h2check.org: could not connect to host +h3artbl33d.nl: could not connect to host haarkliniek.com: did not receive HSTS header habanaavenue.com: did not receive HSTS header habbo.life: did not receive HSTS header @@ -1976,7 +1969,6 @@ hdwallpapers.net: did not receive HSTS header healtious.com: did not receive HSTS header heart.ge: did not receive HSTS header heartlandrentals.com: did not receive HSTS header -heathmanners.com: could not connect to host heidilein.info: did not receive HSTS header helloworldhost.com: did not receive HSTS header helpadmin.net: could not connect to host @@ -1999,11 +1991,11 @@ hideftv.deals: did not receive HSTS header highseer.com: did not receive HSTS header highsurf-miyazaki.com: did not receive HSTS header highvelocitydesign.com: could not connect to host -hiisukun.com: could not connect to host hiitcentre.com: did not receive HSTS header hikariempire.com: could not connect to host hillcity.org.nz: did not receive HSTS header hilnu.tk: could not connect to host +hintss.pw: did not receive HSTS header hipercultura.com: did not receive HSTS header hiphopconvention.nl: could not connect to host hirake55.com: could not connect to host @@ -2103,8 +2095,9 @@ idecode.net: could not connect to host idedr.com: could not connect to host identitylabs.uk: could not connect to host idgsupply.com: could not connect to host +idinby.dk: did not receive HSTS header idlekernel.com: could not connect to host -idontexist.me: could not connect to host +idontexist.me: did not receive HSTS header ie.search.yahoo.com: did not receive HSTS header ies-italia.it: did not receive HSTS header ies.id.lv: could not connect to host @@ -2143,6 +2136,7 @@ immunicity.top: could not connect to host immunicity.works: did not receive HSTS header immunicity.world: did not receive HSTS header imolug.org: did not receive HSTS header +imoto.me: could not connect to host imouto.my: max-age too low: 5184000 imperialwebsolutions.com: did not receive HSTS header imu.li: did not receive HSTS header @@ -2159,7 +2153,6 @@ infinitude.xyz: could not connect to host infinitudecloud.com: could not connect to host infinitusgaming.eu: could not connect to host inflation.ml: could not connect to host -info-sys.tk: could not connect to host infogrfx.com: did not receive HSTS header infosec.rip: could not connect to host infosoph.org: did not receive HSTS header @@ -2186,7 +2179,6 @@ integraelchen.de: could not connect to host intel.li: could not connect to host interference.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] interlun.com: could not connect to host -internect.co.za: did not receive HSTS header internetcasinos.de: could not connect to host internetcensus.org: could not connect to host interserved.com: did not receive HSTS header @@ -2206,7 +2198,6 @@ iora.fr: could not connect to host iosmods.com: did not receive HSTS header iostips.ru: could not connect to host iotsms.io: could not connect to host -ip-life.net: could not connect to host ip6.im: did not receive HSTS header ipmimagazine.com: did not receive HSTS header iprody.com: could not connect to host @@ -2228,6 +2219,7 @@ iseek.biz: max-age too low: 0 ishillaryclintoninprisonyet.com: could not connect to host isitamor.pm: could not connect to host iskaz.rs: did not receive HSTS header +isogen5.com: could not connect to host isogram.nl: could not connect to host israkurort.com: did not receive HSTS header isslshop.com: could not connect to host @@ -2246,7 +2238,6 @@ itsamurai.ru: max-age too low: 2592000 itsecurityassurance.pw: could not connect to host itsg-faq.de: could not connect to host itshost.ru: could not connect to host -itspawned.com: could not connect to host ivancacic.com: did not receive HSTS header ivi-fertility.com: max-age too low: 0 ivi.es: max-age too low: 0 @@ -2370,11 +2361,12 @@ jrgold.me: could not connect to host jrmd.io: could not connect to host jrvar.com: did not receive HSTS header jsanders.us: did not receive HSTS header -jsg-technologies.de: did not receive HSTS header +jsg-technologies.de: could not connect to host jualautoclave.com: did not receive HSTS header jualssh.com: could not connect to host juliamweber.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] julian-kipka.de: could not connect to host +julido.de: did not receive HSTS header jumbox.xyz: could not connect to host junaos.xyz: did not receive HSTS header junge-selbsthilfe.info: could not connect to host @@ -2399,14 +2391,12 @@ kadioglumakina.com.tr: did not receive HSTS header kaela.design: could not connect to host kahopoon.net: could not connect to host kaisers.de: did not receive HSTS header -kaketalk.com: could not connect to host kalami.nl: could not connect to host kamikano.com: could not connect to host kaneo-gmbh.de: did not receive HSTS header kaplatz.is: could not connect to host kapucini.si: max-age too low: 0 karaoketonight.com: could not connect to host -karhukamera.com: could not connect to host karlis-kavacis.id.lv: could not connect to host kasilag.me: did not receive HSTS header katiaetdavid.fr: could not connect to host @@ -2445,7 +2435,6 @@ kienlen.org: could not connect to host kimpost.org: could not connect to host kinderly.co.uk: did not receive HSTS header kinderwagen-test24.de: could not connect to host -kindof.ninja: could not connect to host kingmanhall.org: could not connect to host kini24.ru: could not connect to host kinkdr.com: could not connect to host @@ -2468,7 +2457,7 @@ kitsta.com: could not connect to host kiwiirc.com: max-age too low: 5256000 kizil.net: could not connect to host kjaermaxi.me: did not receive HSTS header -klauwd.com: did not receive HSTS header +klauwd.com: could not connect to host klaxn.org: could not connect to host kleertjesvoordelig.nl: did not receive HSTS header kleinblogje.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] @@ -2504,9 +2493,7 @@ kr.search.yahoo.com: did not receive HSTS header krayx.com: could not connect to host kreavis.com: did not receive HSTS header kredite.sale: could not connect to host -kriegskindernothilfe.de: could not connect to host kriegt.es: did not receive HSTS header -krizevackapajdasija.hr: did not receive HSTS header krizevci.info: did not receive HSTS header kroetenfuchs.de: could not connect to host kropkait.pl: could not connect to host @@ -2536,6 +2523,7 @@ kylinj.com: could not connect to host kyochon.fr: could not connect to host kz.search.yahoo.com: did not receive HSTS header kzjnet.com: could not connect to host +kzsdabas.hu: could not connect to host l2guru.ru: could not connect to host labaia.info: could not connect to host labina.com.tr: did not receive HSTS header @@ -2557,7 +2545,6 @@ lambdafive.co.uk: could not connect to host lampl.info: did not receive HSTS header lancehoteis.com.br: could not connect to host landscape.canonical.com: max-age too low: 2592000 -langbein.org: could not connect to host langenbach.rocks: could not connect to host langhun.me: did not receive HSTS header laobox.fr: could not connect to host @@ -2602,6 +2589,7 @@ leopold.email: could not connect to host leopotamgroup.com: could not connect to host leovanna.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] lepont.pl: could not connect to host +leppis-it.de: could not connect to host lerner.moscow: did not receive HSTS header les-corsaires.net: could not connect to host lesperlesdunet.fr: could not connect to host @@ -2676,13 +2664,14 @@ loadso.me: could not connect to host loafbox.com: could not connect to host loansonline.today: could not connect to host localchum.com: could not connect to host +localhorst.xyz: could not connect to host locktheirphone.com: could not connect to host locomotive.ca: did not receive HSTS header +loftboard.eu: could not connect to host login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless) loginseite.com: could not connect to host lolicore.ch: could not connect to host lolidunno.com: could not connect to host -lolmegafroi.de: could not connect to host londonlanguageexchange.com: could not connect to host lonerwolf.com: did not receive HSTS header look-at-my.site: could not connect to host @@ -2694,6 +2683,7 @@ lostinsecurity.com: could not connect to host lostinweb.eu: could not connect to host lothai.re: did not receive HSTS header lotsencafe.de: did not receive HSTS header +louiewatch.com: could not connect to host loveable.de: could not connect to host lovelifelovelive.com: could not connect to host lovelive.us: did not receive HSTS header @@ -2717,6 +2707,7 @@ luine.xyz: did not receive HSTS header luis-checa.com: could not connect to host luisv.me: could not connect to host lukeng.me: did not receive HSTS header +lukeng.net: did not receive HSTS header lukonet.com: did not receive HSTS header lumd.me: could not connect to host lumi.do: did not receive HSTS header @@ -2761,14 +2752,12 @@ mafamane.com: could not connect to host mafiareturns.com: max-age too low: 2592000 magenx.com: did not receive HSTS header mahamed91.pw: could not connect to host -maidofhonorcleaning.net: could not connect to host mail-settings.google.com: did not receive HSTS header (error ignored - included regardless) mail.google.com: did not receive HSTS header (error ignored - included regardless) maildragon.com: could not connect to host mailhost.it: could not connect to host makeitdynamic.com: could not connect to host makerstuff.net: did not receive HSTS header -makeyourank.com: could not connect to host malerversand.de: did not receive HSTS header malfait.nl: could not connect to host maljaars-media.nl: could not connect to host @@ -2843,7 +2832,7 @@ mcc.re: could not connect to host mcdonalds.ru: did not receive HSTS header mcga.media: did not receive HSTS header mclab.su: could not connect to host -mdcloudps.com: could not connect to host +mdcloudps.com: did not receive HSTS header mdewendt.de: could not connect to host mdfnet.se: did not receive HSTS header mdscomp.net: did not receive HSTS header @@ -2866,7 +2855,6 @@ megakiste.de: could not connect to host megashur.se: did not receive HSTS header megaxchange.com: did not receive HSTS header meghudson.com: could not connect to host -meifrench.com: could not connect to host mein-gesundheitsmanager.com: did not receive HSTS header meincenter-meinemeinung.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] meincloudspeicher.de: could not connect to host @@ -2874,6 +2862,7 @@ meinebo.it: could not connect to host melted.pw: could not connect to host members.mayfirst.org: did not receive HSTS header memory-plus-180.com: could not connect to host +menaraannonces.com: could not connect to host menchez.me: could not connect to host mensmaximus.de: did not receive HSTS header menthix.net: could not connect to host @@ -2897,8 +2886,8 @@ meuemail.pro: could not connect to host mexbt.com: could not connect to host mexicanbusinessweb.mx: did not receive HSTS header mexicansbook.ru: could not connect to host -meyercloud.de: could not connect to host mfcatalin.com: could not connect to host +mfedderke.com: could not connect to host mfiles.pl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] mh-bloemen.co.jp: could not connect to host mhdsyarif.com: did not receive HSTS header @@ -2976,7 +2965,6 @@ mobilethreat.net: could not connect to host mobilethreatnetwork.net: could not connect to host mobilpass.no: could not connect to host mocloud.eu: could not connect to host -moddedark.com: could not connect to host model9.io: did not receive HSTS header modemagazines.co.uk: could not connect to host modernibytovytextil.cz: could not connect to host @@ -2985,8 +2973,6 @@ moebel-nagel.de: did not receive HSTS header moefi.xyz: did not receive HSTS header moelord.org: could not connect to host moen.io: did not receive HSTS header -moeyi.xyz: did not receive HSTS header -mofohome.dyndns.org: could not connect to host mogry.net: did not receive HSTS header moho.kr: could not connect to host mona.lu: did not receive HSTS header @@ -2994,7 +2980,9 @@ monarca.systems: could not connect to host monasterialis.eu: could not connect to host mondar.io: did not receive HSTS header mondopoint.com: did not receive HSTS header +mondwandler.de: could not connect to host moneromerchant.com: could not connect to host +moneycrownmedia.com: could not connect to host moneytoday.com: max-age too low: 0 monitman.com: could not connect to host monsieurbureau.com: did not receive HSTS header @@ -3062,12 +3050,14 @@ mvixturismo.com.br: max-age too low: 0 mvsecurity.nl: could not connect to host mw.search.yahoo.com: did not receive HSTS header my-owncloud.com: could not connect to host +my-voice.nl: could not connect to host my.alfresco.com: did not receive HSTS header my.swedbank.se: did not receive HSTS header my.usa.gov: did not receive HSTS header myairshop.gr: could not connect to host mybon.at: could not connect to host mybudget.xyz: could not connect to host +mychocolateweightloss.com: did not receive HSTS header mycollab.net: could not connect to host mycoted.com: did not receive HSTS header mydeos.com: could not connect to host @@ -3086,15 +3076,14 @@ mypagella.eu: could not connect to host mypagella.it: could not connect to host mypension.ca: could not connect to host myphonebox.de: could not connect to host -mypillcard.com: could not connect to host mysecretrewards.com: did not receive HSTS header mystery-science-theater-3000.de: did not receive HSTS header -mythslegendscollection.com: did not receive HSTS header myweb360.de: did not receive HSTS header myzone.com: did not receive HSTS header n0psled.nl: could not connect to host n2x.in: could not connect to host n4l.pw: could not connect to host +n8ch.net: could not connect to host nabru.co.uk: did not receive HSTS header nabytko.cz: could not connect to host nadia.pt: could not connect to host @@ -3145,6 +3134,7 @@ neofelhz.space: could not connect to host neonisi.com: could not connect to host nepustil.net: did not receive HSTS header nerdjokes.de: did not receive HSTS header +nerven.se: did not receive HSTS header nestedquotes.ca: could not connect to host netba.net: could not connect to host netbox.cc: could not connect to host @@ -3232,7 +3222,7 @@ nopex.no: could not connect to host nopol.de: could not connect to host norandom.com: could not connect to host norb.at: could not connect to host -nosecretshop.com: could not connect to host +nosecretshop.com: did not receive HSTS header notadd.com: did not receive HSTS header note7forever.com: could not connect to host notenoughtime.de: could not connect to host @@ -3252,7 +3242,7 @@ ntbs.pro: could not connect to host ntse.xyz: could not connect to host nu3.at: did not receive HSTS header nu3.ch: did not receive HSTS header -nu3.co.uk: did not receive HSTS header +nu3.co.uk: could not connect to host nu3.com: did not receive HSTS header nu3.de: did not receive HSTS header nu3.dk: did not receive HSTS header @@ -3323,6 +3313,7 @@ oneminute.io: did not receive HSTS header onepluscamps.com: could not connect to host onespiritinc.com: did not receive HSTS header onet.space: could not connect to host +oneway.ga: could not connect to host onewpst.com: did not receive HSTS header oniichan.us: did not receive HSTS header online-casino.eu: did not receive HSTS header @@ -3336,6 +3327,7 @@ onlinespielothek.com: did not receive HSTS header onlinewetten.de: could not connect to host onlyshopstation.com: did not receive HSTS header ononpay.com: did not receive HSTS header +onovlena.dn.ua: could not connect to host onpatient.com: did not receive HSTS header onsitemassageco.com: did not receive HSTS header ontras.com: could not connect to host @@ -3350,6 +3342,7 @@ open-mx.de: could not connect to host open-to-repair.fr: did not receive HSTS header opendesk.cc: did not receive HSTS header openmind-shop.de: did not receive HSTS header +openmtbmap.org: did not receive HSTS header openpriv.pw: did not receive HSTS header openprovider.nl: did not receive HSTS header openquery.com.au: did not receive HSTS header @@ -3425,6 +3418,7 @@ paku.me: could not connect to host pamplona.tv: could not connect to host pamsoft.pl: max-age too low: 0 panaceallc.net: could not connect to host +panama-gbs.com: could not connect to host panamaequity.com: did not receive HSTS header panamateakforestry.com: did not receive HSTS header panoranordic.net: could not connect to host @@ -3470,6 +3464,7 @@ paxwinkel.nl: did not receive HSTS header pay.gigahost.dk: did not receive HSTS header payfreez.com: could not connect to host payments.google.com: did not receive HSTS header (error ignored - included regardless) +paymerang.com: could not connect to host payroll.ch: did not receive HSTS header pbapp.net: did not receive HSTS header pbprint.ru: max-age too low: 0 @@ -3500,7 +3495,6 @@ personaldatabasen.no: could not connect to host personalinjurylist.com: did not receive HSTS header personalizedtouch.co: could not connect to host perthdevicelab.com: did not receive HSTS header -pestici.de: could not connect to host pet-nsk.ru: could not connect to host petchart.net: could not connect to host petit.site: could not connect to host @@ -3534,6 +3528,7 @@ piggott.me.uk: did not receive HSTS header pilgermaske.org: did not receive HSTS header piligrimname.com: could not connect to host pillowandpepper.com: did not receive HSTS header +pincodeit.com: could not connect to host pippen.io: could not connect to host piratedb.com: could not connect to host piratedot.com: could not connect to host @@ -3599,6 +3594,7 @@ poolsandstuff.com: did not receive HSTS header poon.tech: could not connect to host porno-gif.ru: did not receive HSTS header portalplatform.net: did not receive HSTS header +portalzine.de: did not receive HSTS header poshpak.com: max-age too low: 86400 postcodewise.co.uk: did not receive HSTS header postscheduler.org: could not connect to host @@ -3614,7 +3610,6 @@ powerxequality.com: could not connect to host ppr-truby.ru: could not connect to host ppy3.com: did not receive HSTS header pr.search.yahoo.com: did not receive HSTS header -prattpokemon.com: could not connect to host prediksisydney.com: did not receive HSTS header preezzie.com: could not connect to host prefontaine.name: could not connect to host @@ -3635,8 +3630,8 @@ privacylabs.io: did not receive HSTS header privacyrup.net: could not connect to host prnt.li: did not receive HSTS header pro-zone.com: could not connect to host -procens.us: did not receive HSTS header prodpad.com: did not receive HSTS header +production.vn: did not receive HSTS header professionalboundaries.com: did not receive HSTS header profi-durchgangsmelder.de: did not receive HSTS header profundr.com: could not connect to host @@ -3646,7 +3641,6 @@ progress-technologies.com: could not connect to host prohostonline.fi: could not connect to host projectdp.net: could not connect to host projectmercury.space: could not connect to host -prok.pw: could not connect to host promecon-gmbh.de: did not receive HSTS header prontocleaners.co.uk: could not connect to host prontolight.com: did not receive HSTS header @@ -3692,7 +3686,6 @@ qingpat.com: did not receive HSTS header qingxuan.info: max-age too low: 864000 qinxi1992.com: did not receive HSTS header qldconservation.org: could not connect to host -qop.io: could not connect to host qorm.co.uk: did not receive HSTS header qqq.gg: could not connect to host qrara.net: did not receive HSTS header @@ -3737,16 +3730,17 @@ rate-esport.de: could not connect to host rathorian.fr: could not connect to host rationalism.com: could not connect to host ratuseks.com: could not connect to host +ratuseks.us: could not connect to host raulfraile.net: could not connect to host raven.lipetsk.ru: could not connect to host -rawet.se: could not connect to host +rawet.se: did not receive HSTS header rawoil.com: could not connect to host rawstorieslondon.com: could not connect to host raydan.space: could not connect to host raydobe.me: could not connect to host rbhighinc.org: could not connect to host rc-rp.com: did not receive HSTS header -rc4.io: did not receive HSTS header +rc4.io: could not connect to host rcafox.com: could not connect to host rcorporation.be: did not receive HSTS header rcpcbd.com: did not receive HSTS header @@ -3776,6 +3770,7 @@ regenerescence.com: did not receive HSTS header reggae-cdmx.com: did not receive HSTS header rei.ki: could not connect to host reic.me: could not connect to host +reichl-online.net: could not connect to host reisyukaku.org: did not receive HSTS header rejo.in: could not connect to host rejuvemedspa.com: did not receive HSTS header @@ -3805,6 +3800,7 @@ residentsinsurance.co.uk: did not receive HSTS header respice.xyz: could not connect to host respostas.com.br: did not receive HSTS header restchart.com: did not receive HSTS header +restrealitaet.de: did not receive HSTS header retrotracks.net: max-age too low: 0 revealdata.com: did not receive HSTS header revello.org: did not receive HSTS header @@ -3850,7 +3846,6 @@ rochman.id: could not connect to host rocksberg.net: could not connect to host rockstarloan.com: could not connect to host roddis.net: did not receive HSTS header -rodehutskors.net: did not receive HSTS header rodney.id.au: did not receive HSTS header rodosto.com: could not connect to host roeper.party: could not connect to host @@ -3911,7 +3906,7 @@ saferedirect.link: could not connect to host safewings-nh.nl: did not receive HSTS header sageth.com: max-age too low: 0 sah3.net: could not connect to host -sairai.bid: did not receive HSTS header +sairai.bid: could not connect to host sakaki.anime.my: max-age too low: 5184000 sakaserver.com: did not receive HSTS header sakurabuff.com: did not receive HSTS header @@ -3984,6 +3979,7 @@ scrapings.net: could not connect to host screencaster.io: did not receive HSTS header screenresolution.space: could not connect to host screensaversplanet.com: did not receive HSTS header +scribbleserver.com: could not connect to host scribe.systems: could not connect to host scrion.com: could not connect to host script.google.com: did not receive HSTS header (error ignored - included regardless) @@ -3994,7 +3990,6 @@ sdsl-speedtest.de: could not connect to host search-one.de: did not receive HSTS header sebster.com: did not receive HSTS header secandtech.com: could not connect to host -secondpay.nl: could not connect to host sectia22.ro: could not connect to host sectun.com: did not receive HSTS header secure-games.us: could not connect to host @@ -4008,7 +4003,6 @@ securityheaders.com: could not connect to host securityinet.biz: did not receive HSTS header securityinet.net: did not receive HSTS header securityinet.org.il: did not receive HSTS header -securitymap.wiki: did not receive HSTS header securiviera.ch: did not receive HSTS header sedrubal.de: could not connect to host seedboxers.net: did not receive HSTS header @@ -4045,7 +4039,6 @@ servergno.me: did not receive HSTS header servermonkey.nl: could not connect to host seryo.moe: could not connect to host seryo.net: could not connect to host -sesha.co.za: could not connect to host sethcaplan.com: could not connect to host setphaserstostun.org: could not connect to host setuid.de: could not connect to host @@ -4058,7 +4051,6 @@ shadowmorph.info: did not receive HSTS header shadowsocks.net: could not connect to host shakepeers.org: did not receive HSTS header shanesage.com: could not connect to host -shaobin.wang: could not connect to host shareimg.xyz: could not connect to host sharepass.pw: could not connect to host shauncrowley.co.uk: could not connect to host @@ -4071,7 +4063,7 @@ shibe.club: could not connect to host shiftins.com: did not receive HSTS header shiftplanning.com: did not receive HSTS header shiinko.com: could not connect to host -shindorei.fr: could not connect to host +shindorei.fr: did not receive HSTS header shinebijoux.com.br: could not connect to host shinju.moe: could not connect to host shinonome-lab.eu.org: could not connect to host @@ -4083,6 +4075,7 @@ shopontarget.com: did not receive HSTS header shoprose.ru: could not connect to host shops.neonisi.com: could not connect to host shortr.li: could not connect to host +shota.party: could not connect to host showkeeper.tv: did not receive HSTS header shu-kin.net: could not connect to host shukatsu-note.com: could not connect to host @@ -4187,7 +4180,6 @@ snoozedds.com: max-age too low: 600 snoqualmiefiber.org: did not receive HSTS header sobabox.ru: could not connect to host sobie.ch: could not connect to host -sobinski.pl: did not receive HSTS header soboleva-pr.com.ua: could not connect to host sobotkama.eu: did not receive HSTS header soccergif.com: could not connect to host @@ -4252,7 +4244,6 @@ spillmaker.no: did not receive HSTS header spilsbury.io: could not connect to host spititout.it: could not connect to host spittersberger.recipes: did not receive HSTS header -split.is: did not receive HSTS header sponsortobias.com: did not receive HSTS header sportchirp-internal.azurewebsites.net: did not receive HSTS header sporthit.ru: could not connect to host @@ -4264,7 +4255,6 @@ spr.id.au: did not receive HSTS header spreadsheets.google.com: did not receive HSTS header (error ignored - included regardless) sproutconnections.com: did not receive HSTS header sprybear.com: did not receive HSTS header -squaddraft.com: did not receive HSTS header square.gs: could not connect to host squatldf.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] sqzryang.com: did not receive HSTS header @@ -4296,14 +4286,13 @@ stash.ai: did not receive HSTS header state-sponsored-actors.net: could not connect to host statementinsertsforless.com: did not receive HSTS header stateofexception.io: could not connect to host -static.or.at: did not receive HSTS header +static.or.at: could not connect to host staticanime.net: could not connect to host stationaryjourney.com: did not receive HSTS header stationnementdenuit.ca: did not receive HSTS header statuschecks.net: could not connect to host stayokhotelscdc-mailing.com: could not connect to host stcomex.com: did not receive HSTS header -stefanovski.io: could not connect to host stefanweiser.de: did not receive HSTS header steffi-in-australien.com: could not connect to host stephanierxo.com: did not receive HSTS header @@ -4323,6 +4312,7 @@ stirlingpoon.xyz: could not connect to host stkbn.com: did not receive HSTS header stmbgr.com: could not connect to host stn.me.uk: did not receive HSTS header +stockseyeserum.com: could not connect to host stocktrade.de: could not connect to host stoffe-monster.de: did not receive HSTS header stole-my.bike: could not connect to host @@ -4334,7 +4324,7 @@ storefrontify.com: did not receive HSTS header stormhub.org: could not connect to host stpatricksguild.com: did not receive HSTS header stqry.com: did not receive HSTS header -str0.at: did not receive HSTS header +str0.at: could not connect to host strasweb.fr: did not receive HSTS header strbt.de: did not receive HSTS header streamingeverywhere.com: did not receive HSTS header @@ -4374,7 +4364,7 @@ suksit.com: could not connect to host sumoatm.com: did not receive HSTS header sumoscout.de: did not receive HSTS header suncountrymarine.com: did not receive HSTS header -sunfulong.me: could not connect to host +sunflyer.cn: did not receive HSTS header sunnyfruit.ru: did not receive HSTS header sunshinepress.org: could not connect to host supcro.com: could not connect to host @@ -4452,7 +4442,7 @@ taskstats.com: could not connect to host taskulu.ir: could not connect to host tasmansecurity.com: could not connect to host tastyyy.co: could not connect to host -tatilbus.com: did not receive HSTS header +tatilbus.com: could not connect to host tauchkater.de: could not connect to host tavopica.lt: did not receive HSTS header taxbench.com: could not connect to host @@ -4482,6 +4472,7 @@ technogroup.cz: did not receive HSTS header technosavvyport.com: did not receive HSTS header techpointed.com: could not connect to host techreview.link: could not connect to host +tecnimotos.com: did not receive HSTS header tegelsensanitaironline.nl: did not receive HSTS header teknotes.co.uk: could not connect to host tekshrek.com: did not receive HSTS header @@ -4504,6 +4495,7 @@ terrax.info: could not connect to host testandroid.xyz: could not connect to host testbawks.com: did not receive HSTS header testnode.xyz: could not connect to host +testosterone-complex.com: could not connect to host teulon.eu: could not connect to host texte-zur-taufe.de: did not receive HSTS header texter-linz.at: did not receive HSTS header @@ -4576,6 +4568,7 @@ thirdpartytrade.com: did not receive HSTS header thirty5.net: did not receive HSTS header thisisacompletetest.ga: could not connect to host thisisforager.com: could not connect to host +thisishugo.com: did not receive HSTS header thiswebhost.com: did not receive HSTS header thomaskliszowski.fr: did not receive HSTS header thomasschweizer.net: could not connect to host @@ -4638,6 +4631,7 @@ todamateria.com.br: did not receive HSTS header todo.is: did not receive HSTS header todobazar.es: could not connect to host togelonlinecommunity.com: did not receive HSTS header +tokoyo.biz: could not connect to host tollmanz.com: did not receive HSTS header tolud.com: could not connect to host tomask.info: max-age too low: 86400 @@ -4674,17 +4668,14 @@ tradinews.fr: could not connect to host tradingcentre.com.au: did not receive HSTS header tradinghope.com: could not connect to host traindb.nl: did not receive HSTS header -trainhornforums.com: did not receive HSTS header trainut.com: could not connect to host transitownplaza.com: could not connect to host translate.googleapis.com: did not receive HSTS header (error ignored - included regardless) transportal.sk: did not receive HSTS header travelinsurance.co.nz: did not receive HSTS header -treasuredinheritanceministry.com: did not receive HSTS header treatprostatewithhifu.com: did not receive HSTS header treeby.net: could not connect to host trendberry.ru: could not connect to host -trik.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] trinityaffirmations.com: max-age too low: 0 trinitycore.org: max-age too low: 2592000 tripdelta.com: did not receive HSTS header @@ -4746,15 +4737,16 @@ tzappa.net: could not connect to host u-blox.com: max-age too low: 0 ua.search.yahoo.com: did not receive HSTS header uadp.pw: did not receive HSTS header +uber.com.au: did not receive HSTS header uberfunction.com: did not receive HSTS header ubicloud.de: could not connect to host -ubicv.com: could not connect to host +ubicv.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] ublox.com: did not receive HSTS header +uborcare.com: could not connect to host ubuntuhot.com: did not receive HSTS header -udruga-point.hr: did not receive HSTS header uega.net: did not receive HSTS header ufgaming.com: did not receive HSTS header -ufotable.uk: did not receive HSTS header +ufotable.uk: could not connect to host ui8.net: max-age too low: 86400 ukas.com: did not receive HSTS header ukdropshipment.co.uk: did not receive HSTS header @@ -4785,7 +4777,7 @@ unfiltered.nyc: did not receive HSTS header unfuddle.cn: could not connect to host uni-games.com: could not connect to host unicooo.com: did not receive HSTS header -unikitty-on-tour.com: did not receive HSTS header +unikitty-on-tour.com: could not connect to host unison.com: did not receive HSTS header unisyssecurity.com: did not receive HSTS header unitedcyberdevelopment.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] @@ -4816,7 +4808,7 @@ usaa.com: did not receive HSTS header usbtypeccompliant.com: could not connect to host uscitizenship.info: did not receive HSTS header uscntalk.com: could not connect to host -uscurrency.gov: did not receive HSTS header +uscurrency.gov: could not connect to host used-in.jp: did not receive HSTS header usercare.com: did not receive HSTS header userify.com: did not receive HSTS header @@ -4824,6 +4816,7 @@ ustr.gov: max-age too low: 86400 utilitarianism.net: did not receive HSTS header utleieplassen.no: could not connect to host utopiagalaxy.space: could not connect to host +utopianconcept.com: did not receive HSTS header utopianhomespa.com: did not receive HSTS header utumno.ch: could not connect to host utvbloggen.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] @@ -4906,7 +4899,6 @@ vitalita.cz: did not receive HSTS header vitalorange.com: did not receive HSTS header vitta.me: did not receive HSTS header viva-french.com: did not receive HSTS header -vivocloud.com: did not receive HSTS header vlastimilburian.cz: did not receive HSTS header vlora.city: could not connect to host vm0.eu: did not receive HSTS header @@ -4921,6 +4913,7 @@ voidpay.net: could not connect to host voidpay.org: could not connect to host volcrado.com: did not receive HSTS header volkden.com: could not connect to host +vooreenveiligthuis.nl: did not receive HSTS header vortexhobbies.com: did not receive HSTS header voshod.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] vosjesweb.nl: did not receive HSTS header @@ -4964,7 +4957,6 @@ watersportmarkt.net: did not receive HSTS header watsonhall.uk: could not connect to host wave.is: could not connect to host wavefrontsystemstech.com: could not connect to host -wayne.cloud: could not connect to host wealthfactory.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] wear2work.nl: did not receive HSTS header wearandcare.net: could not connect to host @@ -5011,7 +5003,7 @@ wendalyncheng.com: did not receive HSTS header werdeeintimo.de: did not receive HSTS header werkenbijkfc.nl: did not receive HSTS header werkplaatsoost.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] -werkruimtebottendaal.nl: could not connect to host +werkruimtebottendaal.nl: did not receive HSTS header wesleyharris.ca: did not receive HSTS header westendzone.com: max-age too low: 0 westerhoud.nl: did not receive HSTS header @@ -5027,6 +5019,7 @@ whatnext.limited: did not receive HSTS header whats.io: did not receive HSTS header whatsstalk.me: could not connect to host when-release.com: did not receive HSTS header +whisker.network: could not connect to host whitehat.id: could not connect to host whiterabbitcakery.com: could not connect to host whitestagforge.com: did not receive HSTS header @@ -5048,6 +5041,7 @@ william.si: did not receive HSTS header willosagiede.com: did not receive HSTS header winaes.com: did not receive HSTS header winclient.cn: could not connect to host +windhaven.nl: could not connect to host winecodeavocado.com: could not connect to host winged.io: could not connect to host wingumd.net: could not connect to host @@ -5125,6 +5119,7 @@ www3.info: did not receive HSTS header wxukang.cn: could not connect to host wyzphoto.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] x-power-detox.com: could not connect to host +x-ripped-hd.com: could not connect to host x2w.io: could not connect to host x3led.com: could not connect to host x509.pub: could not connect to host @@ -5175,8 +5170,10 @@ xn--yoamomisuasbcn-ynb.com: could not connect to host xnode.org: did not receive HSTS header xobox.me: could not connect to host xoffy.com: did not receive HSTS header +xom.party: could not connect to host xombra.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no] xpi.fr: could not connect to host +xrippedhd.com: could not connect to host xsmobile.de: could not connect to host xtream-hosting.com: could not connect to host xtream-hosting.de: could not connect to host @@ -5190,6 +5187,7 @@ y-o-w.com: did not receive HSTS header y-s.pw: max-age too low: 2592000 yabrt.cn: could not connect to host yagi2.com: could not connect to host +yal.sh: could not connect to host yalook.com: did not receive HSTS header yamamo10.com: could not connect to host yanwh.xyz: did not receive HSTS header @@ -5198,6 +5196,7 @@ yard-fu.com: could not connect to host yardbird.us: could not connect to host yasinaydin.net: max-age too low: 2592000 yaucy.win: could not connect to host +ycc.wtf: could not connect to host yd.io: could not connect to host ydy.jp: could not connect to host yello.website: could not connect to host @@ -5209,7 +5208,8 @@ yenniferallulli.moda: could not connect to host yenniferallulli.nl: could not connect to host yestees.com: did not receive HSTS header yetcore.io: could not connect to host -yin.roma.it: could not connect to host +yikzu.cn: could not connect to host +yin.roma.it: did not receive HSTS header yingyj.com: could not connect to host yippie.nl: did not receive HSTS header yjsoft.me: did not receive HSTS header @@ -5220,12 +5220,10 @@ yokeepo.com: max-age too low: 0 yoloboatrentals.com: did not receive HSTS header yoloprod.fr: could not connect to host yoloseo.com: could not connect to host -yoramvandevelde.net: could not connect to host youcontrol.ru: could not connect to host youngandunited.nl: did not receive HSTS header youon.tokyo: could not connect to host yourbapp.ch: could not connect to host -yourciso.com: could not connect to host yourcomputer.expert: did not receive HSTS header yoursecondphone.co: could not connect to host yourstrongbox.com: could not connect to host diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc index a31b016bb706e..b375ae0481898 100644 --- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1500995608677000); +const PRTime gPreloadListExpirationTime = INT64_C(1501080391017000); static const char kSTSHostTable[] = { /* "0.me.uk", true */ '0', '.', 'm', 'e', '.', 'u', 'k', '\0', @@ -28,7 +28,6 @@ static const char kSTSHostTable[] = { /* "0knowledge.de", true */ '0', 'k', 'n', 'o', 'w', 'l', 'e', 'd', 'g', 'e', '.', 'd', 'e', '\0', /* "0o0.ooo", true */ '0', 'o', '0', '.', 'o', 'o', 'o', '\0', /* "0paste.com", true */ '0', 'p', 'a', 's', 't', 'e', '.', 'c', 'o', 'm', '\0', - /* "0x.cx", true */ '0', 'x', '.', 'c', 'x', '\0', /* "0x.sk", true */ '0', 'x', '.', 's', 'k', '\0', /* "0x17.de", true */ '0', 'x', '1', '7', '.', 'd', 'e', '\0', /* "0x52.net", true */ '0', 'x', '5', '2', '.', 'n', 'e', 't', '\0', @@ -42,6 +41,7 @@ static const char kSTSHostTable[] = { /* "0xAA55.me", true */ '0', 'x', 'A', 'A', '5', '5', '.', 'm', 'e', '\0', /* "0xaa55.me", true */ '0', 'x', 'a', 'a', '5', '5', '.', 'm', 'e', '\0', /* "0xabe.io", true */ '0', 'x', 'a', 'b', 'e', '.', 'i', 'o', '\0', + /* "0xacab.org", true */ '0', 'x', 'a', 'c', 'a', 'b', '.', 'o', 'r', 'g', '\0', /* "0xda.de", true */ '0', 'x', 'd', 'a', '.', 'd', 'e', '\0', /* "0xdefaced.de", true */ '0', 'x', 'd', 'e', 'f', 'a', 'c', 'e', 'd', '.', 'd', 'e', '\0', /* "0xee.eu", true */ '0', 'x', 'e', 'e', '.', 'e', 'u', '\0', @@ -49,7 +49,6 @@ static const char kSTSHostTable[] = { /* "0xn.de", true */ '0', 'x', 'n', '.', 'd', 'e', '\0', /* "10000v.ru", true */ '1', '0', '0', '0', '0', 'v', '.', 'r', 'u', '\0', /* "1000minds.com", true */ '1', '0', '0', '0', 'm', 'i', 'n', 'd', 's', '.', 'c', 'o', 'm', '\0', - /* "1000serien.com", true */ '1', '0', '0', '0', 's', 'e', 'r', 'i', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "1001.best", true */ '1', '0', '0', '1', '.', 'b', 'e', 's', 't', '\0', /* "1001kerstpakketten.com", false */ '1', '0', '0', '1', 'k', 'e', 'r', 's', 't', 'p', 'a', 'k', 'k', 'e', 't', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "100onrainkajino.com", true */ '1', '0', '0', 'o', 'n', 'r', 'a', 'i', 'n', 'k', 'a', 'j', 'i', 'n', 'o', '.', 'c', 'o', 'm', '\0', @@ -134,6 +133,7 @@ static const char kSTSHostTable[] = { /* "24sihu.com", false */ '2', '4', 's', 'i', 'h', 'u', '.', 'c', 'o', 'm', '\0', /* "2600edinburgh.org", true */ '2', '6', '0', '0', 'e', 'd', 'i', 'n', 'b', 'u', 'r', 'g', 'h', '.', 'o', 'r', 'g', '\0', /* "2600hq.com", true */ '2', '6', '0', '0', 'h', 'q', '.', 'c', 'o', 'm', '\0', + /* "263.info", true */ '2', '6', '3', '.', 'i', 'n', 'f', 'o', '\0', /* "28spots.net", true */ '2', '8', 's', 'p', 'o', 't', 's', '.', 'n', 'e', 't', '\0', /* "2acbi-asso.fr", true */ '2', 'a', 'c', 'b', 'i', '-', 'a', 's', 's', 'o', '.', 'f', 'r', '\0', /* "2bas.nl", true */ '2', 'b', 'a', 's', '.', 'n', 'l', '\0', @@ -209,6 +209,7 @@ static const char kSTSHostTable[] = { /* "4x.fi", true */ '4', 'x', '.', 'f', 'i', '\0', /* "500p.xyz", true */ '5', '0', '0', 'p', '.', 'x', 'y', 'z', '\0', /* "50plusnet.nl", true */ '5', '0', 'p', 'l', 'u', 's', 'n', 'e', 't', '.', 'n', 'l', '\0', + /* "525.info", true */ '5', '2', '5', '.', 'i', 'n', 'f', 'o', '\0', /* "52neptune.com", true */ '5', '2', 'n', 'e', 'p', 't', 'u', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "54below.com", true */ '5', '4', 'b', 'e', 'l', 'o', 'w', '.', 'c', 'o', 'm', '\0', /* "54bf.com", true */ '5', '4', 'b', 'f', '.', 'c', 'o', 'm', '\0', @@ -303,7 +304,6 @@ static const char kSTSHostTable[] = { /* "abolitionist-society.com", true */ 'a', 'b', 'o', 'l', 'i', 't', 'i', 'o', 'n', 'i', 's', 't', '-', 's', 'o', 'c', 'i', 'e', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "abolitionist.com", true */ 'a', 'b', 'o', 'l', 'i', 't', 'i', 'o', 'n', 'i', 's', 't', '.', 'c', 'o', 'm', '\0', /* "abou.to", false */ 'a', 'b', 'o', 'u', '.', 't', 'o', '\0', - /* "about.ge", true */ 'a', 'b', 'o', 'u', 't', '.', 'g', 'e', '\0', /* "aboutassistedliving.org", true */ 'a', 'b', 'o', 'u', 't', 'a', 's', 's', 'i', 's', 't', 'e', 'd', 'l', 'i', 'v', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0', /* "abrilect.com", true */ 'a', 'b', 'r', 'i', 'l', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0', /* "abseits.org", true */ 'a', 'b', 's', 'e', 'i', 't', 's', '.', 'o', 'r', 'g', '\0', @@ -322,6 +322,7 @@ static const char kSTSHostTable[] = { /* "academicenterprise.org", true */ 'a', 'c', 'a', 'd', 'e', 'm', 'i', 'c', 'e', 'n', 't', 'e', 'r', 'p', 'r', 'i', 's', 'e', '.', 'o', 'r', 'g', '\0', /* "acara-yoga.de", true */ 'a', 'c', 'a', 'r', 'a', '-', 'y', 'o', 'g', 'a', '.', 'd', 'e', '\0', /* "acbc.ie", true */ 'a', 'c', 'b', 'c', '.', 'i', 'e', '\0', + /* "accelerateyourworld.org", true */ 'a', 'c', 'c', 'e', 'l', 'e', 'r', 'a', 't', 'e', 'y', 'o', 'u', 'r', 'w', 'o', 'r', 'l', 'd', '.', 'o', 'r', 'g', '\0', /* "accelight.co.jp", true */ 'a', 'c', 'c', 'e', 'l', 'i', 'g', 'h', 't', '.', 'c', 'o', '.', 'j', 'p', '\0', /* "accelight.jp", true */ 'a', 'c', 'c', 'e', 'l', 'i', 'g', 'h', 't', '.', 'j', 'p', '\0', /* "access-sofia.org", true */ 'a', 'c', 'c', 'e', 's', 's', '-', 's', 'o', 'f', 'i', 'a', '.', 'o', 'r', 'g', '\0', @@ -352,7 +353,7 @@ static const char kSTSHostTable[] = { /* "acnpacific.com", true */ 'a', 'c', 'n', 'p', 'a', 'c', 'i', 'f', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "acoffeeshops.com", true */ 'a', 'c', 'o', 'f', 'f', 'e', 'e', 's', 'h', 'o', 'p', 's', '.', 'c', 'o', 'm', '\0', /* "acourse.io", true */ 'a', 'c', 'o', 'u', 'r', 's', 'e', '.', 'i', 'o', '\0', - /* "acritelli.com", true */ 'a', 'c', 'r', 'i', 't', 'e', 'l', 'l', 'i', '.', 'c', 'o', 'm', '\0', + /* "acritelli.com", false */ 'a', 'c', 'r', 'i', 't', 'e', 'l', 'l', 'i', '.', 'c', 'o', 'm', '\0', /* "acrossgw.com", true */ 'a', 'c', 'r', 'o', 's', 's', 'g', 'w', '.', 'c', 'o', 'm', '\0', /* "acrylicwifi.com", true */ 'a', 'c', 'r', 'y', 'l', 'i', 'c', 'w', 'i', 'f', 'i', '.', 'c', 'o', 'm', '\0', /* "acsemb.org", true */ 'a', 'c', 's', 'e', 'm', 'b', '.', 'o', 'r', 'g', '\0', @@ -406,6 +407,7 @@ static const char kSTSHostTable[] = { /* "adderall.space", true */ 'a', 'd', 'd', 'e', 'r', 'a', 'l', 'l', '.', 's', 'p', 'a', 'c', 'e', '\0', /* "addstar.jp", true */ 'a', 'd', 'd', 's', 't', 'a', 'r', '.', 'j', 'p', '\0', /* "addtoany.com", true */ 'a', 'd', 'd', 't', 'o', 'a', 'n', 'y', '.', 'c', 'o', 'm', '\0', + /* "adduono.com", true */ 'a', 'd', 'd', 'u', 'o', 'n', 'o', '.', 'c', 'o', 'm', '\0', /* "adec-emsa.ae", true */ 'a', 'd', 'e', 'c', '-', 'e', 'm', 's', 'a', '.', 'a', 'e', '\0', /* "adelaides.com", true */ 'a', 'd', 'e', 'l', 'a', 'i', 'd', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "adelebeals.com", true */ 'a', 'd', 'e', 'l', 'e', 'b', 'e', 'a', 'l', 's', '.', 'c', 'o', 'm', '\0', @@ -495,6 +497,7 @@ static const char kSTSHostTable[] = { /* "afri.cc", true */ 'a', 'f', 'r', 'i', '.', 'c', 'c', '\0', /* "africa.dating", true */ 'a', 'f', 'r', 'i', 'c', 'a', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "africatravel.de", true */ 'a', 'f', 'r', 'i', 'c', 'a', 't', 'r', 'a', 'v', 'e', 'l', '.', 'd', 'e', '\0', + /* "afrodigital.uk", true */ 'a', 'f', 'r', 'o', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'u', 'k', '\0', /* "after.im", true */ 'a', 'f', 't', 'e', 'r', '.', 'i', 'm', '\0', /* "afterstack.net", true */ 'a', 'f', 't', 'e', 'r', 's', 't', 'a', 'c', 'k', '.', 'n', 'e', 't', '\0', /* "afuh.de", true */ 'a', 'f', 'u', 'h', '.', 'd', 'e', '\0', @@ -533,7 +536,6 @@ static const char kSTSHostTable[] = { /* "ahmerjamilkhan.org", true */ 'a', 'h', 'm', 'e', 'r', 'j', 'a', 'm', 'i', 'l', 'k', 'h', 'a', 'n', '.', 'o', 'r', 'g', '\0', /* "ahoyconference.com", true */ 'a', 'h', 'o', 'y', 'c', 'o', 'n', 'f', 'e', 'r', 'e', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "ahrq.gov", false */ 'a', 'h', 'r', 'q', '.', 'g', 'o', 'v', '\0', - /* "ahughes03.com", true */ 'a', 'h', 'u', 'g', 'h', 'e', 's', '0', '3', '.', 'c', 'o', 'm', '\0', /* "ahwah.net", true */ 'a', 'h', 'w', 'a', 'h', '.', 'n', 'e', 't', '\0', /* "ahwatukeefoothillsmontessori.com", true */ 'a', 'h', 'w', 'a', 't', 'u', 'k', 'e', 'e', 'f', 'o', 'o', 't', 'h', 'i', 'l', 'l', 's', 'm', 'o', 'n', 't', 'e', 's', 's', 'o', 'r', 'i', '.', 'c', 'o', 'm', '\0', /* "ahxxm.com", true */ 'a', 'h', 'x', 'x', 'm', '.', 'c', 'o', 'm', '\0', @@ -555,7 +557,6 @@ static const char kSTSHostTable[] = { /* "aikido-wels.at", true */ 'a', 'i', 'k', 'i', 'd', 'o', '-', 'w', 'e', 'l', 's', '.', 'a', 't', '\0', /* "aimeeandalec.com", true */ 'a', 'i', 'm', 'e', 'e', 'a', 'n', 'd', 'a', 'l', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "aimotive.com", true */ 'a', 'i', 'm', 'o', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0', - /* "aiois.com", true */ 'a', 'i', 'o', 'i', 's', '.', 'c', 'o', 'm', '\0', /* "airbly.com", true */ 'a', 'i', 'r', 'b', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "airbnbopen.com", true */ 'a', 'i', 'r', 'b', 'n', 'b', 'o', 'p', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "airedaleterrier.com.br", true */ 'a', 'i', 'r', 'e', 'd', 'a', 'l', 'e', 't', 'e', 'r', 'r', 'i', 'e', 'r', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -844,8 +845,8 @@ static const char kSTSHostTable[] = { /* "andreasolsson.se", true */ 'a', 'n', 'd', 'r', 'e', 'a', 's', 'o', 'l', 's', 's', 'o', 'n', '.', 's', 'e', '\0', /* "andrehansen.de", true */ 'a', 'n', 'd', 'r', 'e', 'h', 'a', 'n', 's', 'e', 'n', '.', 'd', 'e', '\0', /* "andrepicard.de", true */ 'a', 'n', 'd', 'r', 'e', 'p', 'i', 'c', 'a', 'r', 'd', '.', 'd', 'e', '\0', - /* "andrew.london", true */ 'a', 'n', 'd', 'r', 'e', 'w', '.', 'l', 'o', 'n', 'd', 'o', 'n', '\0', /* "andrewdaws.tv", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'd', 'a', 'w', 's', '.', 't', 'v', '\0', + /* "andrewhowden.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'h', 'o', 'w', 'd', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "andrewimeson.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'i', 'm', 'e', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "andrewin.ru", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'i', 'n', '.', 'r', 'u', '\0', /* "andrewmichaud.com", true */ 'a', 'n', 'd', 'r', 'e', 'w', 'm', 'i', 'c', 'h', 'a', 'u', 'd', '.', 'c', 'o', 'm', '\0', @@ -907,8 +908,6 @@ static const char kSTSHostTable[] = { /* "anonukradio.org", true */ 'a', 'n', 'o', 'n', 'u', 'k', 'r', 'a', 'd', 'i', 'o', '.', 'o', 'r', 'g', '\0', /* "anonym-surfen.de", true */ 'a', 'n', 'o', 'n', 'y', 'm', '-', 's', 'u', 'r', 'f', 'e', 'n', '.', 'd', 'e', '\0', /* "anonyme-spieler.at", true */ 'a', 'n', 'o', 'n', 'y', 'm', 'e', '-', 's', 'p', 'i', 'e', 'l', 'e', 'r', '.', 'a', 't', '\0', - /* "anonymo.co.uk", true */ 'a', 'n', 'o', 'n', 'y', 'm', 'o', '.', 'c', 'o', '.', 'u', 'k', '\0', - /* "anonymo.uk", true */ 'a', 'n', 'o', 'n', 'y', 'm', 'o', '.', 'u', 'k', '\0', /* "anotherchef.com", true */ 'a', 'n', 'o', 't', 'h', 'e', 'r', 'c', 'h', 'e', 'f', '.', 'c', 'o', 'm', '\0', /* "anotherfatgeek.net", true */ 'a', 'n', 'o', 't', 'h', 'e', 'r', 'f', 'a', 't', 'g', 'e', 'e', 'k', '.', 'n', 'e', 't', '\0', /* "ans-delft.nl", true */ 'a', 'n', 's', '-', 'd', 'e', 'l', 'f', 't', '.', 'n', 'l', '\0', @@ -949,7 +948,6 @@ static const char kSTSHostTable[] = { /* "aoku3d.com", true */ 'a', 'o', 'k', 'u', '3', 'd', '.', 'c', 'o', 'm', '\0', /* "aolabs.nz", true */ 'a', 'o', 'l', 'a', 'b', 's', '.', 'n', 'z', '\0', /* "aopedeure.nl", true */ 'a', 'o', 'p', 'e', 'd', 'e', 'u', 'r', 'e', '.', 'n', 'l', '\0', - /* "aosc.io", false */ 'a', 'o', 's', 'c', '.', 'i', 'o', '\0', /* "aosus.org", true */ 'a', 'o', 's', 'u', 's', '.', 'o', 'r', 'g', '\0', /* "aov.io", true */ 'a', 'o', 'v', '.', 'i', 'o', '\0', /* "aovcentrum.nl", true */ 'a', 'o', 'v', 'c', 'e', 'n', 't', 'r', 'u', 'm', '.', 'n', 'l', '\0', @@ -1025,6 +1023,7 @@ static const char kSTSHostTable[] = { /* "aqqrate.com", true */ 'a', 'q', 'q', 'r', 'a', 't', 'e', '.', 'c', 'o', 'm', '\0', /* "aquahomo.com", true */ 'a', 'q', 'u', 'a', 'h', 'o', 'm', 'o', '.', 'c', 'o', 'm', '\0', /* "aqualife.com.gr", true */ 'a', 'q', 'u', 'a', 'l', 'i', 'f', 'e', '.', 'c', 'o', 'm', '.', 'g', 'r', '\0', + /* "aqualogy.de", true */ 'a', 'q', 'u', 'a', 'l', 'o', 'g', 'y', '.', 'd', 'e', '\0', /* "aquapoint.kiev.ua", true */ 'a', 'q', 'u', 'a', 'p', 'o', 'i', 'n', 't', '.', 'k', 'i', 'e', 'v', '.', 'u', 'a', '\0', /* "aquaron.com", true */ 'a', 'q', 'u', 'a', 'r', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "aquavitaedayspa.com.au", true */ 'a', 'q', 'u', 'a', 'v', 'i', 't', 'a', 'e', 'd', 'a', 'y', 's', 'p', 'a', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', @@ -1151,6 +1150,7 @@ static const char kSTSHostTable[] = { /* "as200753.com", true */ 'a', 's', '2', '0', '0', '7', '5', '3', '.', 'c', 'o', 'm', '\0', /* "as200753.net", true */ 'a', 's', '2', '0', '0', '7', '5', '3', '.', 'n', 'e', 't', '\0', /* "asadatec.de", true */ 'a', 's', 'a', 'd', 'a', 't', 'e', 'c', '.', 'd', 'e', '\0', + /* "asadzulfahri.com", true */ 'a', 's', 'a', 'd', 'z', 'u', 'l', 'f', 'a', 'h', 'r', 'i', '.', 'c', 'o', 'm', '\0', /* "asafilm.co", true */ 'a', 's', 'a', 'f', 'i', 'l', 'm', '.', 'c', 'o', '\0', /* "asahikoji.net", true */ 'a', 's', 'a', 'h', 'i', 'k', 'o', 'j', 'i', '.', 'n', 'e', 't', '\0', /* "asandu.eu", true */ 'a', 's', 'a', 'n', 'd', 'u', '.', 'e', 'u', '\0', @@ -1224,6 +1224,7 @@ static const char kSTSHostTable[] = { /* "atlantichomes.com.au", true */ 'a', 't', 'l', 'a', 'n', 't', 'i', 'c', 'h', 'o', 'm', 'e', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "atlantis-kh.noip.me", true */ 'a', 't', 'l', 'a', 'n', 't', 'i', 's', '-', 'k', 'h', '.', 'n', 'o', 'i', 'p', '.', 'm', 'e', '\0', /* "atlantischild.hu", true */ 'a', 't', 'l', 'a', 'n', 't', 'i', 's', 'c', 'h', 'i', 'l', 'd', '.', 'h', 'u', '\0', + /* "atlas.co", true */ 'a', 't', 'l', 'a', 's', '.', 'c', 'o', '\0', /* "atlascultural.com", true */ 'a', 't', 'l', 'a', 's', 'c', 'u', 'l', 't', 'u', 'r', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "atlassian.net", true */ 'a', 't', 'l', 'a', 's', 's', 'i', 'a', 'n', '.', 'n', 'e', 't', '\0', /* "atletika.hu", true */ 'a', 't', 'l', 'e', 't', 'i', 'k', 'a', '.', 'h', 'u', '\0', @@ -1287,7 +1288,6 @@ static const char kSTSHostTable[] = { /* "australiancattle.dog", true */ 'a', 'u', 's', 't', 'r', 'a', 'l', 'i', 'a', 'n', 'c', 'a', 't', 't', 'l', 'e', '.', 'd', 'o', 'g', '\0', /* "auszeit.bio", true */ 'a', 'u', 's', 'z', 'e', 'i', 't', '.', 'b', 'i', 'o', '\0', /* "auth.adult", true */ 'a', 'u', 't', 'h', '.', 'a', 'd', 'u', 'l', 't', '\0', - /* "authint.com", true */ 'a', 'u', 't', 'h', 'i', 'n', 't', '.', 'c', 'o', 'm', '\0', /* "author24.ru", true */ 'a', 'u', 't', 'h', 'o', 'r', '2', '4', '.', 'r', 'u', '\0', /* "autimatisering.nl", true */ 'a', 'u', 't', 'i', 'm', 'a', 't', 'i', 's', 'e', 'r', 'i', 'n', 'g', '.', 'n', 'l', '\0', /* "auto-anleitung.de", true */ 'a', 'u', 't', 'o', '-', 'a', 'n', 'l', 'e', 'i', 't', 'u', 'n', 'g', '.', 'd', 'e', '\0', @@ -1310,6 +1310,7 @@ static const char kSTSHostTable[] = { /* "autoskole.hr", true */ 'a', 'u', 't', 'o', 's', 'k', 'o', 'l', 'e', '.', 'h', 'r', '\0', /* "autoverzekeringafsluiten.com", true */ 'a', 'u', 't', 'o', 'v', 'e', 'r', 'z', 'e', 'k', 'e', 'r', 'i', 'n', 'g', 'a', 'f', 's', 'l', 'u', 'i', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "auxetek.se", true */ 'a', 'u', 'x', 'e', 't', 'e', 'k', '.', 's', 'e', '\0', + /* "av.de", true */ 'a', 'v', '.', 'd', 'e', '\0', /* "ava-creative.de", true */ 'a', 'v', 'a', '-', 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '.', 'd', 'e', '\0', /* "avaaz.org", true */ 'a', 'v', 'a', 'a', 'z', '.', 'o', 'r', 'g', '\0', /* "avacariu.me", true */ 'a', 'v', 'a', 'c', 'a', 'r', 'i', 'u', '.', 'm', 'e', '\0', @@ -1412,6 +1413,7 @@ static const char kSTSHostTable[] = { /* "badges.fedoraproject.org", true */ 'b', 'a', 'd', 'g', 'e', 's', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0', /* "badges.stg.fedoraproject.org", true */ 'b', 'a', 'd', 'g', 'e', 's', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0', /* "badhusky.com", true */ 'b', 'a', 'd', 'h', 'u', 's', 'k', 'y', '.', 'c', 'o', 'm', '\0', + /* "badlink.org", true */ 'b', 'a', 'd', 'l', 'i', 'n', 'k', '.', 'o', 'r', 'g', '\0', /* "badoo.com", true */ 'b', 'a', 'd', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "baer.im", true */ 'b', 'a', 'e', 'r', '.', 'i', 'm', '\0', /* "baer.one", true */ 'b', 'a', 'e', 'r', '.', 'o', 'n', 'e', '\0', @@ -1531,7 +1533,6 @@ static const char kSTSHostTable[] = { /* "bazos.sk", true */ 'b', 'a', 'z', 'o', 's', '.', 's', 'k', '\0', /* "bazziergraphik.com", true */ 'b', 'a', 'z', 'z', 'i', 'e', 'r', 'g', 'r', 'a', 'p', 'h', 'i', 'k', '.', 'c', 'o', 'm', '\0', /* "bb-shiokaze.jp", true */ 'b', 'b', '-', 's', 'h', 'i', 'o', 'k', 'a', 'z', 'e', '.', 'j', 'p', '\0', - /* "bbb1991.me", true */ 'b', 'b', 'b', '1', '9', '9', '1', '.', 'm', 'e', '\0', /* "bbdos.ru", true */ 'b', 'b', 'd', 'o', 's', '.', 'r', 'u', '\0', /* "bblove.me", true */ 'b', 'b', 'l', 'o', 'v', 'e', '.', 'm', 'e', '\0', /* "bblovess.cn", true */ 'b', 'b', 'l', 'o', 'v', 'e', 's', 's', '.', 'c', 'n', '\0', @@ -1562,6 +1563,7 @@ static const char kSTSHostTable[] = { /* "be-real.life", true */ 'b', 'e', '-', 'r', 'e', 'a', 'l', '.', 'l', 'i', 'f', 'e', '\0', /* "be-webdesign.com", true */ 'b', 'e', '-', 'w', 'e', 'b', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0', /* "be2cloud.de", true */ 'b', 'e', '2', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0', + /* "beamitapp.com", true */ 'b', 'e', 'a', 'm', 'i', 't', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0', /* "beanjuice.me", true */ 'b', 'e', 'a', 'n', 'j', 'u', 'i', 'c', 'e', '.', 'm', 'e', '\0', /* "beans-one.com", false */ 'b', 'e', 'a', 'n', 's', '-', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "beanworks.ca", true */ 'b', 'e', 'a', 'n', 'w', 'o', 'r', 'k', 's', '.', 'c', 'a', '\0', @@ -1712,6 +1714,7 @@ static const char kSTSHostTable[] = { /* "betterbabyshop.com.au", true */ 'b', 'e', 't', 't', 'e', 'r', 'b', 'a', 'b', 'y', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "bettercrypto.org", true */ 'b', 'e', 't', 't', 'e', 'r', 'c', 'r', 'y', 'p', 't', 'o', '.', 'o', 'r', 'g', '\0', /* "betterhelp.com", true */ 'b', 'e', 't', 't', 'e', 'r', 'h', 'e', 'l', 'p', '.', 'c', 'o', 'm', '\0', + /* "betterlifemakers.com", true */ 'b', 'e', 't', 't', 'e', 'r', 'l', 'i', 'f', 'e', 'm', 'a', 'k', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "betterscience.org", true */ 'b', 'e', 't', 't', 'e', 'r', 's', 'c', 'i', 'e', 'n', 'c', 'e', '.', 'o', 'r', 'g', '\0', /* "bettertest.it", true */ 'b', 'e', 't', 't', 'e', 'r', 't', 'e', 's', 't', '.', 'i', 't', '\0', /* "bettingbusiness.ru", true */ 'b', 'e', 't', 't', 'i', 'n', 'g', 'b', 'u', 's', 'i', 'n', 'e', 's', 's', '.', 'r', 'u', '\0', @@ -2145,7 +2148,6 @@ static const char kSTSHostTable[] = { /* "bradler.net", true */ 'b', 'r', 'a', 'd', 'l', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "braemer-it-consulting.de", true */ 'b', 'r', 'a', 'e', 'm', 'e', 'r', '-', 'i', 't', '-', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'd', 'e', '\0', /* "bragasoft.com.br", true */ 'b', 'r', 'a', 'g', 'a', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', - /* "brage.info", true */ 'b', 'r', 'a', 'g', 'e', '.', 'i', 'n', 'f', 'o', '\0', /* "brahmstaedt.de", true */ 'b', 'r', 'a', 'h', 'm', 's', 't', 'a', 'e', 'd', 't', '.', 'd', 'e', '\0', /* "brain-e.co", true */ 'b', 'r', 'a', 'i', 'n', '-', 'e', '.', 'c', 'o', '\0', /* "brainfork.org", true */ 'b', 'r', 'a', 'i', 'n', 'f', 'o', 'r', 'k', '.', 'o', 'r', 'g', '\0', @@ -2249,6 +2251,7 @@ static const char kSTSHostTable[] = { /* "bruun.co", true */ 'b', 'r', 'u', 'u', 'n', '.', 'c', 'o', '\0', /* "bryankaplan.com", true */ 'b', 'r', 'y', 'a', 'n', 'k', 'a', 'p', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "bryanquigley.com", true */ 'b', 'r', 'y', 'a', 'n', 'q', 'u', 'i', 'g', 'l', 'e', 'y', '.', 'c', 'o', 'm', '\0', + /* "bryn.xyz", true */ 'b', 'r', 'y', 'n', '.', 'x', 'y', 'z', '\0', /* "brztec.com", true */ 'b', 'r', 'z', 't', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "bsalyzer.com", true */ 'b', 's', 'a', 'l', 'y', 'z', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "bsdfreak.dk", true */ 'b', 's', 'd', 'f', 'r', 'e', 'a', 'k', '.', 'd', 'k', '\0', @@ -2321,6 +2324,7 @@ static const char kSTSHostTable[] = { /* "bullbits.com", true */ 'b', 'u', 'l', 'l', 'b', 'i', 't', 's', '.', 'c', 'o', 'm', '\0', /* "bulldog-hosting.de", true */ 'b', 'u', 'l', 'l', 'd', 'o', 'g', '-', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'd', 'e', '\0', /* "bullterrier.me", true */ 'b', 'u', 'l', 'l', 't', 'e', 'r', 'r', 'i', 'e', 'r', '.', 'm', 'e', '\0', + /* "bulmafox.com", true */ 'b', 'u', 'l', 'm', 'a', 'f', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "bulmastife.com.br", true */ 'b', 'u', 'l', 'm', 'a', 's', 't', 'i', 'f', 'e', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "bumshow.ru", true */ 'b', 'u', 'm', 's', 'h', 'o', 'w', '.', 'r', 'u', '\0', /* "bunbomenu.de", true */ 'b', 'u', 'n', 'b', 'o', 'm', 'e', 'n', 'u', '.', 'd', 'e', '\0', @@ -2412,10 +2416,10 @@ static const char kSTSHostTable[] = { /* "byteshark.org", true */ 'b', 'y', 't', 'e', 's', 'h', 'a', 'r', 'k', '.', 'o', 'r', 'g', '\0', /* "bytesofcode.de", true */ 'b', 'y', 't', 'e', 's', 'o', 'f', 'c', 'o', 'd', 'e', '.', 'd', 'e', '\0', /* "bytesunlimited.com", true */ 'b', 'y', 't', 'e', 's', 'u', 'n', 'l', 'i', 'm', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0', + /* "bytesystems.com", true */ 'b', 'y', 't', 'e', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0', /* "byteturtle.eu", true */ 'b', 'y', 't', 'e', 't', 'u', 'r', 't', 'l', 'e', '.', 'e', 'u', '\0', /* "bythisverse.com", true */ 'b', 'y', 't', 'h', 'i', 's', 'v', 'e', 'r', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "byurudraw.pics", true */ 'b', 'y', 'u', 'r', 'u', 'd', 'r', 'a', 'w', '.', 'p', 'i', 'c', 's', '\0', - /* "bziaks.xyz", true */ 'b', 'z', 'i', 'a', 'k', 's', '.', 'x', 'y', 'z', '\0', /* "bztech.com.br", true */ 'b', 'z', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "bzv-fr.eu", true */ 'b', 'z', 'v', '-', 'f', 'r', '.', 'e', 'u', '\0', /* "c-path.org", true */ 'c', '-', 'p', 'a', 't', 'h', '.', 'o', 'r', 'g', '\0', @@ -2568,7 +2572,6 @@ static const char kSTSHostTable[] = { /* "carauctionsgeorgia.com", true */ 'c', 'a', 'r', 'a', 'u', 'c', 't', 'i', 'o', 'n', 's', 'g', 'e', 'o', 'r', 'g', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "carbon12.org", true */ 'c', 'a', 'r', 'b', 'o', 'n', '1', '2', '.', 'o', 'r', 'g', '\0', /* "carbon12.software", true */ 'c', 'a', 'r', 'b', 'o', 'n', '1', '2', '.', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '\0', - /* "carboneselectricosnettosl.info", false */ 'c', 'a', 'r', 'b', 'o', 'n', 'e', 's', 'e', 'l', 'e', 'c', 't', 'r', 'i', 'c', 'o', 's', 'n', 'e', 't', 't', 'o', 's', 'l', '.', 'i', 'n', 'f', 'o', '\0', /* "carbonmade.com", false */ 'c', 'a', 'r', 'b', 'o', 'n', 'm', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "card-toka.jp", true */ 'c', 'a', 'r', 'd', '-', 't', 'o', 'k', 'a', '.', 'j', 'p', '\0', /* "cardloan-manual.net", true */ 'c', 'a', 'r', 'd', 'l', 'o', 'a', 'n', '-', 'm', 'a', 'n', 'u', 'a', 'l', '.', 'n', 'e', 't', '\0', @@ -2748,7 +2751,9 @@ static const char kSTSHostTable[] = { /* "ch.search.yahoo.com", false */ 'c', 'h', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "chabaudparfum.com", true */ 'c', 'h', 'a', 'b', 'a', 'u', 'd', 'p', 'a', 'r', 'f', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "chadstoneapartments.com.au", true */ 'c', 'h', 'a', 'd', 's', 't', 'o', 'n', 'e', 'a', 'p', 'a', 'r', 't', 'm', 'e', 'n', 't', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', + /* "chahub.com", true */ 'c', 'h', 'a', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0', /* "chaletmanager.com", true */ 'c', 'h', 'a', 'l', 'e', 't', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'c', 'o', 'm', '\0', + /* "chalkfestival.org", false */ 'c', 'h', 'a', 'l', 'k', 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', '.', 'o', 'r', 'g', '\0', /* "chamathellawala.com", true */ 'c', 'h', 'a', 'm', 'a', 't', 'h', 'e', 'l', 'l', 'a', 'w', 'a', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "chameth.com", true */ 'c', 'h', 'a', 'm', 'e', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "chamilo.org", true */ 'c', 'h', 'a', 'm', 'i', 'l', 'o', '.', 'o', 'r', 'g', '\0', @@ -2795,6 +2800,7 @@ static const char kSTSHostTable[] = { /* "chatnbook.com", true */ 'c', 'h', 'a', 't', 'n', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0', /* "chatnederland.eu", true */ 'c', 'h', 'a', 't', 'n', 'e', 'd', 'e', 'r', 'l', 'a', 'n', 'd', '.', 'e', 'u', '\0', /* "chatt-gratis.org", true */ 'c', 'h', 'a', 't', 't', '-', 'g', 'r', 'a', 't', 'i', 's', '.', 'o', 'r', 'g', '\0', + /* "chatxp.com", true */ 'c', 'h', 'a', 't', 'x', 'p', '.', 'c', 'o', 'm', '\0', /* "chatxsingle.net", true */ 'c', 'h', 'a', 't', 'x', 's', 'i', 'n', 'g', 'l', 'e', '.', 'n', 'e', 't', '\0', /* "chatxtutti.com", true */ 'c', 'h', 'a', 't', 'x', 't', 'u', 't', 't', 'i', '.', 'c', 'o', 'm', '\0', /* "chaz6.com", true */ 'c', 'h', 'a', 'z', '6', '.', 'c', 'o', 'm', '\0', @@ -2980,7 +2986,6 @@ static const char kSTSHostTable[] = { /* "citylights.eu", true */ 'c', 'i', 't', 'y', 'l', 'i', 'g', 'h', 't', 's', '.', 'e', 'u', '\0', /* "ciubotaru.tk", true */ 'c', 'i', 'u', 'b', 'o', 't', 'a', 'r', 'u', '.', 't', 'k', '\0', /* "ciuciucadou.ro", true */ 'c', 'i', 'u', 'c', 'i', 'u', 'c', 'a', 'd', 'o', 'u', '.', 'r', 'o', '\0', - /* "cium.ru", true */ 'c', 'i', 'u', 'm', '.', 'r', 'u', '\0', /* "ciurcasdan.eu", true */ 'c', 'i', 'u', 'r', 'c', 'a', 's', 'd', 'a', 'n', '.', 'e', 'u', '\0', /* "cj-jackson.com", true */ 'c', 'j', '-', 'j', 'a', 'c', 'k', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "cjcaron.org", true */ 'c', 'j', 'c', 'a', 'r', 'o', 'n', '.', 'o', 'r', 'g', '\0', @@ -3008,6 +3013,7 @@ static const char kSTSHostTable[] = { /* "classpoint.cz", true */ 'c', 'l', 'a', 's', 's', 'p', 'o', 'i', 'n', 't', '.', 'c', 'z', '\0', /* "claudio4.com", true */ 'c', 'l', 'a', 'u', 'd', 'i', 'o', '4', '.', 'c', 'o', 'm', '\0', /* "clawe.de", true */ 'c', 'l', 'a', 'w', 'e', '.', 'd', 'e', '\0', + /* "cldly.com", true */ 'c', 'l', 'd', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "clearkonjac.com", true */ 'c', 'l', 'e', 'a', 'r', 'k', 'o', 'n', 'j', 'a', 'c', '.', 'c', 'o', 'm', '\0', /* "clearsettle-admin.com", true */ 'c', 'l', 'e', 'a', 'r', 's', 'e', 't', 't', 'l', 'e', '-', 'a', 'd', 'm', 'i', 'n', '.', 'c', 'o', 'm', '\0', /* "clearviewwealthprojector.com.au", true */ 'c', 'l', 'e', 'a', 'r', 'v', 'i', 'e', 'w', 'w', 'e', 'a', 'l', 't', 'h', 'p', 'r', 'o', 'j', 'e', 'c', 't', 'o', 'r', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', @@ -3063,7 +3069,6 @@ static const char kSTSHostTable[] = { /* "cloudcaprice.net", true */ 'c', 'l', 'o', 'u', 'd', 'c', 'a', 'p', 'r', 'i', 'c', 'e', '.', 'n', 'e', 't', '\0', /* "cloudflareonazure.com", true */ 'c', 'l', 'o', 'u', 'd', 'f', 'l', 'a', 'r', 'e', 'o', 'n', 'a', 'z', 'u', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "cloudia.org", true */ 'c', 'l', 'o', 'u', 'd', 'i', 'a', '.', 'o', 'r', 'g', '\0', - /* "cloudily.com", true */ 'c', 'l', 'o', 'u', 'd', 'i', 'l', 'y', '.', 'c', 'o', 'm', '\0', /* "cloudmigrator365.com", true */ 'c', 'l', 'o', 'u', 'd', 'm', 'i', 'g', 'r', 'a', 't', 'o', 'r', '3', '6', '5', '.', 'c', 'o', 'm', '\0', /* "cloudoptimizedsmb.com", true */ 'c', 'l', 'o', 'u', 'd', 'o', 'p', 't', 'i', 'm', 'i', 'z', 'e', 'd', 's', 'm', 'b', '.', 'c', 'o', 'm', '\0', /* "cloudoptimus.com", true */ 'c', 'l', 'o', 'u', 'd', 'o', 'p', 't', 'i', 'm', 'u', 's', '.', 'c', 'o', 'm', '\0', @@ -3141,7 +3146,6 @@ static const char kSTSHostTable[] = { /* "codeplay.org", true */ 'c', 'o', 'd', 'e', 'p', 'l', 'a', 'y', '.', 'o', 'r', 'g', '\0', /* "codepoints.net", true */ 'c', 'o', 'd', 'e', 'p', 'o', 'i', 'n', 't', 's', '.', 'n', 'e', 't', '\0', /* "codepref.com", true */ 'c', 'o', 'd', 'e', 'p', 'r', 'e', 'f', '.', 'c', 'o', 'm', '\0', - /* "codepult.com", true */ 'c', 'o', 'd', 'e', 'p', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0', /* "codera.co.uk", true */ 'c', 'o', 'd', 'e', 'r', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "codercross.com", true */ 'c', 'o', 'd', 'e', 'r', 'c', 'r', 'o', 's', 's', '.', 'c', 'o', 'm', '\0', /* "codereview.appspot.com", false */ 'c', 'o', 'd', 'e', 'r', 'e', 'v', 'i', 'e', 'w', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0', @@ -3149,6 +3153,7 @@ static const char kSTSHostTable[] = { /* "coderhangout.com", true */ 'c', 'o', 'd', 'e', 'r', 'h', 'a', 'n', 'g', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0', /* "codesport.io", true */ 'c', 'o', 'd', 'e', 's', 'p', 'o', 'r', 't', '.', 'i', 'o', '\0', /* "codeux.com", true */ 'c', 'o', 'd', 'e', 'u', 'x', '.', 'c', 'o', 'm', '\0', + /* "codewild.de", true */ 'c', 'o', 'd', 'e', 'w', 'i', 'l', 'd', '.', 'd', 'e', '\0', /* "codewiz.xyz", true */ 'c', 'o', 'd', 'e', 'w', 'i', 'z', '.', 'x', 'y', 'z', '\0', /* "codeyellow.nl", true */ 'c', 'o', 'd', 'e', 'y', 'e', 'l', 'l', 'o', 'w', '.', 'n', 'l', '\0', /* "codigosddd.com.br", true */ 'c', 'o', 'd', 'i', 'g', 'o', 's', 'd', 'd', 'd', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -3165,6 +3170,7 @@ static const char kSTSHostTable[] = { /* "cognitivecomputingconsortium.com", true */ 'c', 'o', 'g', 'n', 'i', 't', 'i', 'v', 'e', 'c', 'o', 'm', 'p', 'u', 't', 'i', 'n', 'g', 'c', 'o', 'n', 's', 'o', 'r', 't', 'i', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "cogumelosmagicos.org", true */ 'c', 'o', 'g', 'u', 'm', 'e', 'l', 'o', 's', 'm', 'a', 'g', 'i', 'c', 'o', 's', '.', 'o', 'r', 'g', '\0', /* "cohesive.io", true */ 'c', 'o', 'h', 'e', 's', 'i', 'v', 'e', '.', 'i', 'o', '\0', + /* "coi-verify.com", true */ 'c', 'o', 'i', '-', 'v', 'e', 'r', 'i', 'f', 'y', '.', 'c', 'o', 'm', '\0', /* "coimmvest.com", true */ 'c', 'o', 'i', 'm', 'm', 'v', 'e', 's', 't', '.', 'c', 'o', 'm', '\0', /* "coin.dance", true */ 'c', 'o', 'i', 'n', '.', 'd', 'a', 'n', 'c', 'e', '\0', /* "coinapult.com", true */ 'c', 'o', 'i', 'n', 'a', 'p', 'u', 'l', 't', '.', 'c', 'o', 'm', '\0', @@ -3199,6 +3205,7 @@ static const char kSTSHostTable[] = { /* "collectiblebeans.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'b', 'l', 'e', 'b', 'e', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "collectosaurus.com", true */ 'c', 'o', 'l', 'l', 'e', 'c', 't', 'o', 's', 'a', 'u', 'r', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "collegepulse.org", false */ 'c', 'o', 'l', 'l', 'e', 'g', 'e', 'p', 'u', 'l', 's', 'e', '.', 'o', 'r', 'g', '\0', + /* "collies.eu", true */ 'c', 'o', 'l', 'l', 'i', 'e', 's', '.', 'e', 'u', '\0', /* "collinghammethodist.org.uk", true */ 'c', 'o', 'l', 'l', 'i', 'n', 'g', 'h', 'a', 'm', 'm', 'e', 't', 'h', 'o', 'd', 'i', 's', 't', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0', /* "collinmbarrett.com", true */ 'c', 'o', 'l', 'l', 'i', 'n', 'm', 'b', 'a', 'r', 'r', 'e', 't', 't', '.', 'c', 'o', 'm', '\0', /* "collinsartworks.com", true */ 'c', 'o', 'l', 'l', 'i', 'n', 's', 'a', 'r', 't', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0', @@ -3348,6 +3355,7 @@ static const char kSTSHostTable[] = { /* "coreless-stretchfilm.com", true */ 'c', 'o', 'r', 'e', 'l', 'e', 's', 's', '-', 's', 't', 'r', 'e', 't', 'c', 'h', 'f', 'i', 'l', 'm', '.', 'c', 'o', 'm', '\0', /* "corepartners.com.ua", true */ 'c', 'o', 'r', 'e', 'p', 'a', 'r', 't', 'n', 'e', 'r', 's', '.', 'c', 'o', 'm', '.', 'u', 'a', '\0', /* "coresolutions.ca", true */ 'c', 'o', 'r', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'a', '\0', + /* "coreum.ca", true */ 'c', 'o', 'r', 'e', 'u', 'm', '.', 'c', 'a', '\0', /* "corex.io", true */ 'c', 'o', 'r', 'e', 'x', '.', 'i', 'o', '\0', /* "coreyjmahler.com", true */ 'c', 'o', 'r', 'e', 'y', 'j', 'm', 'a', 'h', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "corgi.party", true */ 'c', 'o', 'r', 'g', 'i', '.', 'p', 'a', 'r', 't', 'y', '\0', @@ -3435,7 +3443,6 @@ static const char kSTSHostTable[] = { /* "crazypaul.com", true */ 'c', 'r', 'a', 'z', 'y', 'p', 'a', 'u', 'l', '.', 'c', 'o', 'm', '\0', /* "crbug.com", true */ 'c', 'r', 'b', 'u', 'g', '.', 'c', 'o', 'm', '\0', /* "crea.me", true */ 'c', 'r', 'e', 'a', '.', 'm', 'e', '\0', - /* "create-test-publish.co.uk", true */ 'c', 'r', 'e', 'a', 't', 'e', '-', 't', 'e', 's', 't', '-', 'p', 'u', 'b', 'l', 'i', 's', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "creative-wave.fr", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '-', 'w', 'a', 'v', 'e', '.', 'f', 'r', '\0', /* "creativeartifice.com", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'a', 'r', 't', 'i', 'f', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "creativecaptiv.es", true */ 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', 'c', 'a', 'p', 't', 'i', 'v', '.', 'e', 's', '\0', @@ -3773,6 +3780,7 @@ static const char kSTSHostTable[] = { /* "darkshop.nl", true */ 'd', 'a', 'r', 'k', 's', 'h', 'o', 'p', '.', 'n', 'l', '\0', /* "darkside.re", true */ 'd', 'a', 'r', 'k', 's', 'i', 'd', 'e', '.', 'r', 'e', '\0', /* "darkspacelab.com", true */ 'd', 'a', 'r', 'k', 's', 'p', 'a', 'c', 'e', 'l', 'a', 'b', '.', 'c', 'o', 'm', '\0', + /* "darkstance.org", true */ 'd', 'a', 'r', 'k', 's', 't', 'a', 'n', 'c', 'e', '.', 'o', 'r', 'g', '\0', /* "darktime.ru", true */ 'd', 'a', 'r', 'k', 't', 'i', 'm', 'e', '.', 'r', 'u', '\0', /* "darktree.in", true */ 'd', 'a', 'r', 'k', 't', 'r', 'e', 'e', '.', 'i', 'n', '\0', /* "darkwater.info", true */ 'd', 'a', 'r', 'k', 'w', 'a', 't', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0', @@ -3983,7 +3991,6 @@ static const char kSTSHostTable[] = { /* "demfloro.ru", true */ 'd', 'e', 'm', 'f', 'l', 'o', 'r', 'o', '.', 'r', 'u', '\0', /* "demo.swedbank.se", true */ 'd', 'e', 'm', 'o', '.', 's', 'w', 'e', 'd', 'b', 'a', 'n', 'k', '.', 's', 'e', '\0', /* "democracy.io", true */ 'd', 'e', 'm', 'o', 'c', 'r', 'a', 'c', 'y', '.', 'i', 'o', '\0', - /* "demomanca.com", true */ 'd', 'e', 'm', 'o', 'm', 'a', 'n', 'c', 'a', '.', 'c', 'o', 'm', '\0', /* "demonwav.com", true */ 'd', 'e', 'm', 'o', 'n', 'w', 'a', 'v', '.', 'c', 'o', 'm', '\0', /* "demonwolfdev.com", true */ 'd', 'e', 'm', 'o', 'n', 'w', 'o', 'l', 'f', 'd', 'e', 'v', '.', 'c', 'o', 'm', '\0', /* "dempsters.ca", true */ 'd', 'e', 'm', 'p', 's', 't', 'e', 'r', 's', '.', 'c', 'a', '\0', @@ -4068,6 +4075,7 @@ static const char kSTSHostTable[] = { /* "devct.cz", true */ 'd', 'e', 'v', 'c', 't', '.', 'c', 'z', '\0', /* "devdesco.com", true */ 'd', 'e', 'v', 'd', 'e', 's', 'c', 'o', '.', 'c', 'o', 'm', '\0', /* "devdom.io", true */ 'd', 'e', 'v', 'd', 'o', 'm', '.', 'i', 'o', '\0', + /* "devdoodle.net", true */ 'd', 'e', 'v', 'd', 'o', 'o', 'd', 'l', 'e', '.', 'n', 'e', 't', '\0', /* "devel.cz", true */ 'd', 'e', 'v', 'e', 'l', '.', 'c', 'z', '\0', /* "developer.mydigipass.com", false */ 'd', 'e', 'v', 'e', 'l', 'o', 'p', 'e', 'r', '.', 'm', 'y', 'd', 'i', 'g', 'i', 'p', 'a', 's', 's', '.', 'c', 'o', 'm', '\0', /* "developerfair.com", true */ 'd', 'e', 'v', 'e', 'l', 'o', 'p', 'e', 'r', 'f', 'a', 'i', 'r', '.', 'c', 'o', 'm', '\0', @@ -4223,7 +4231,6 @@ static const char kSTSHostTable[] = { /* "dir2epub.com", true */ 'd', 'i', 'r', '2', 'e', 'p', 'u', 'b', '.', 'c', 'o', 'm', '\0', /* "dir2epub.org", true */ 'd', 'i', 'r', '2', 'e', 'p', 'u', 'b', '.', 'o', 'r', 'g', '\0', /* "directebanking.com", true */ 'd', 'i', 'r', 'e', 'c', 't', 'e', 'b', 'a', 'n', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', - /* "directhskincream.com", true */ 'd', 'i', 'r', 'e', 'c', 't', 'h', 's', 'k', 'i', 'n', 'c', 'r', 'e', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "directinsure.in", true */ 'd', 'i', 'r', 'e', 'c', 't', 'i', 'n', 's', 'u', 'r', 'e', '.', 'i', 'n', '\0', /* "directlinkfunding.co.uk", true */ 'd', 'i', 'r', 'e', 'c', 't', 'l', 'i', 'n', 'k', 'f', 'u', 'n', 'd', 'i', 'n', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "directme.ga", true */ 'd', 'i', 'r', 'e', 'c', 't', 'm', 'e', '.', 'g', 'a', '\0', @@ -4474,7 +4481,6 @@ static const char kSTSHostTable[] = { /* "dreamcreator108.com", true */ 'd', 'r', 'e', 'a', 'm', 'c', 'r', 'e', 'a', 't', 'o', 'r', '1', '0', '8', '.', 'c', 'o', 'm', '\0', /* "dreaming.solutions", true */ 'd', 'r', 'e', 'a', 'm', 'i', 'n', 'g', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0', /* "dreamlandmagic.com", true */ 'd', 'r', 'e', 'a', 'm', 'l', 'a', 'n', 'd', 'm', 'a', 'g', 'i', 'c', '.', 'c', 'o', 'm', '\0', - /* "dreamlighteyeserum.com", true */ 'd', 'r', 'e', 'a', 'm', 'l', 'i', 'g', 'h', 't', 'e', 'y', 'e', 's', 'e', 'r', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "dreamlinehost.com", false */ 'd', 'r', 'e', 'a', 'm', 'l', 'i', 'n', 'e', 'h', 'o', 's', 't', '.', 'c', 'o', 'm', '\0', /* "dreamsforabetterworld.com.au", true */ 'd', 'r', 'e', 'a', 'm', 's', 'f', 'o', 'r', 'a', 'b', 'e', 't', 't', 'e', 'r', 'w', 'o', 'r', 'l', 'd', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "dreamtechie.com", true */ 'd', 'r', 'e', 'a', 'm', 't', 'e', 'c', 'h', 'i', 'e', '.', 'c', 'o', 'm', '\0', @@ -4483,6 +4489,7 @@ static const char kSTSHostTable[] = { /* "drevo-door.cz", true */ 'd', 'r', 'e', 'v', 'o', '-', 'd', 'o', 'o', 'r', '.', 'c', 'z', '\0', /* "drew.red", true */ 'd', 'r', 'e', 'w', '.', 'r', 'e', 'd', '\0', /* "dreweryinc.com", true */ 'd', 'r', 'e', 'w', 'e', 'r', 'y', 'i', 'n', 'c', '.', 'c', 'o', 'm', '\0', + /* "drewgle.net", true */ 'd', 'r', 'e', 'w', 'g', 'l', 'e', '.', 'n', 'e', 't', '\0', /* "drewsilcock.co.uk", true */ 'd', 'r', 'e', 'w', 's', 'i', 'l', 'c', 'o', 'c', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "drgn.no", true */ 'd', 'r', 'g', 'n', '.', 'n', 'o', '\0', /* "driesjtuver.nl", true */ 'd', 'r', 'i', 'e', 's', 'j', 't', 'u', 'v', 'e', 'r', '.', 'n', 'l', '\0', @@ -4772,7 +4779,6 @@ static const char kSTSHostTable[] = { /* "egablo.black", true */ 'e', 'g', 'a', 'b', 'l', 'o', '.', 'b', 'l', 'a', 'c', 'k', '\0', /* "eganassociates.com.au", true */ 'e', 'g', 'a', 'n', 'a', 's', 's', 'o', 'c', 'i', 'a', 't', 'e', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "egb.at", true */ 'e', 'g', 'b', '.', 'a', 't', '\0', - /* "egbert.net", true */ 'e', 'g', 'b', 'e', 'r', 't', '.', 'n', 'e', 't', '\0', /* "egfl.org.uk", true */ 'e', 'g', 'f', 'l', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0', /* "egge.com", true */ 'e', 'g', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "eggplant.today", true */ 'e', 'g', 'g', 'p', 'l', 'a', 'n', 't', '.', 't', 'o', 'd', 'a', 'y', '\0', @@ -4807,7 +4813,6 @@ static const char kSTSHostTable[] = { /* "einheizpreis.de", true */ 'e', 'i', 'n', 'h', 'e', 'i', 'z', 'p', 'r', 'e', 'i', 's', '.', 'd', 'e', '\0', /* "einsatzstellenverwaltung.de", true */ 'e', 'i', 'n', 's', 'a', 't', 'z', 's', 't', 'e', 'l', 'l', 'e', 'n', 'v', 'e', 'r', 'w', 'a', 'l', 't', 'u', 'n', 'g', '.', 'd', 'e', '\0', /* "eintageinzug.de", true */ 'e', 'i', 'n', 't', 'a', 'g', 'e', 'i', 'n', 'z', 'u', 'g', '.', 'd', 'e', '\0', - /* "eipione.com", true */ 'e', 'i', 'p', 'i', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "eirastudios.co.uk", false */ 'e', 'i', 'r', 'a', 's', 't', 'u', 'd', 'i', 'o', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "eisp.it", false */ 'e', 'i', 's', 'p', '.', 'i', 't', '\0', /* "eit-web.de", false */ 'e', 'i', 't', '-', 'w', 'e', 'b', '.', 'd', 'e', '\0', @@ -4992,7 +4997,6 @@ static const char kSTSHostTable[] = { /* "enlatte.com", true */ 'e', 'n', 'l', 'a', 't', 't', 'e', '.', 'c', 'o', 'm', '\0', /* "enlightened.si", true */ 'e', 'n', 'l', 'i', 'g', 'h', 't', 'e', 'n', 'e', 'd', '.', 's', 'i', '\0', /* "enlightenedhr.com", true */ 'e', 'n', 'l', 'i', 'g', 'h', 't', 'e', 'n', 'e', 'd', 'h', 'r', '.', 'c', 'o', 'm', '\0', - /* "enlightenment.org", true */ 'e', 'n', 'l', 'i', 'g', 'h', 't', 'e', 'n', 'm', 'e', 'n', 't', '.', 'o', 'r', 'g', '\0', /* "enloestatebank.com", true */ 'e', 'n', 'l', 'o', 'e', 's', 't', 'a', 't', 'e', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "ennori.jp", true */ 'e', 'n', 'n', 'o', 'r', 'i', '.', 'j', 'p', '\0', /* "enorekcah.com", true */ 'e', 'n', 'o', 'r', 'e', 'k', 'c', 'a', 'h', '.', 'c', 'o', 'm', '\0', @@ -5034,7 +5038,7 @@ static const char kSTSHostTable[] = { /* "epicwalnutcreek.com", true */ 'e', 'p', 'i', 'c', 'w', 'a', 'l', 'n', 'u', 't', 'c', 'r', 'e', 'e', 'k', '.', 'c', 'o', 'm', '\0', /* "epizentrum.work", true */ 'e', 'p', 'i', 'z', 'e', 'n', 't', 'r', 'u', 'm', '.', 'w', 'o', 'r', 'k', '\0', /* "epizentrum.works", true */ 'e', 'p', 'i', 'z', 'e', 'n', 't', 'r', 'u', 'm', '.', 'w', 'o', 'r', 'k', 's', '\0', - /* "epoch.com", false */ 'e', 'p', 'o', 'c', 'h', '.', 'c', 'o', 'm', '\0', + /* "epoch.com", true */ 'e', 'p', 'o', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "epostplus.li", true */ 'e', 'p', 'o', 's', 't', 'p', 'l', 'u', 's', '.', 'l', 'i', '\0', /* "eprofitacademy.com", true */ 'e', 'p', 'r', 'o', 'f', 'i', 't', 'a', 'c', 'a', 'd', 'e', 'm', 'y', '.', 'c', 'o', 'm', '\0', /* "epsilon.dk", true */ 'e', 'p', 's', 'i', 'l', 'o', 'n', '.', 'd', 'k', '\0', @@ -5048,6 +5052,7 @@ static const char kSTSHostTable[] = { /* "equatetechnologies.com.au", false */ 'e', 'q', 'u', 'a', 't', 'e', 't', 'e', 'c', 'h', 'n', 'o', 'l', 'o', 'g', 'i', 'e', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "equidam.com", true */ 'e', 'q', 'u', 'i', 'd', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "equipsupply.com", true */ 'e', 'q', 'u', 'i', 'p', 's', 'u', 'p', 'p', 'l', 'y', '.', 'c', 'o', 'm', '\0', + /* "equitee.co", true */ 'e', 'q', 'u', 'i', 't', 'e', 'e', '.', 'c', 'o', '\0', /* "erasmusplusrooms.com", true */ 'e', 'r', 'a', 's', 'm', 'u', 's', 'p', 'l', 'u', 's', 'r', 'o', 'o', 'm', 's', '.', 'c', 'o', 'm', '\0', /* "erdethamburgeronsdag.no", true */ 'e', 'r', 'd', 'e', 't', 'h', 'a', 'm', 'b', 'u', 'r', 'g', 'e', 'r', 'o', 'n', 's', 'd', 'a', 'g', '.', 'n', 'o', '\0', /* "erepublik-deutschland.de", true */ 'e', 'r', 'e', 'p', 'u', 'b', 'l', 'i', 'k', '-', 'd', 'e', 'u', 't', 's', 'c', 'h', 'l', 'a', 'n', 'd', '.', 'd', 'e', '\0', @@ -5425,7 +5430,6 @@ static const char kSTSHostTable[] = { /* "faretravel.co.uk", true */ 'f', 'a', 'r', 'e', 't', 'r', 'a', 'v', 'e', 'l', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "farfetchos.com", true */ 'f', 'a', 'r', 'f', 'e', 't', 'c', 'h', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "fargtorget.se", true */ 'f', 'a', 'r', 'g', 't', 'o', 'r', 'g', 'e', 't', '.', 's', 'e', '\0', - /* "farhood.org", true */ 'f', 'a', 'r', 'h', 'o', 'o', 'd', '.', 'o', 'r', 'g', '\0', /* "farmacia.pt", true */ 'f', 'a', 'r', 'm', 'a', 'c', 'i', 'a', '.', 'p', 't', '\0', /* "farmacialaboratorio.it", true */ 'f', 'a', 'r', 'm', 'a', 'c', 'i', 'a', 'l', 'a', 'b', 'o', 'r', 'a', 't', 'o', 'r', 'i', 'o', '.', 'i', 't', '\0', /* "farmer.dating", true */ 'f', 'a', 'r', 'm', 'e', 'r', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', @@ -5449,12 +5453,13 @@ static const char kSTSHostTable[] = { /* "faspirits.com", true */ 'f', 'a', 's', 'p', 'i', 'r', 'i', 't', 's', '.', 'c', 'o', 'm', '\0', /* "fassadenverkleidung24.de", true */ 'f', 'a', 's', 's', 'a', 'd', 'e', 'n', 'v', 'e', 'r', 'k', 'l', 'e', 'i', 'd', 'u', 'n', 'g', '2', '4', '.', 'd', 'e', '\0', /* "fastaim.de", true */ 'f', 'a', 's', 't', 'a', 'i', 'm', '.', 'd', 'e', '\0', + /* "fastcomcorp.com", true */ 'f', 'a', 's', 't', 'c', 'o', 'm', 'c', 'o', 'r', 'p', '.', 'c', 'o', 'm', '\0', + /* "fastcomcorp.net", true */ 'f', 'a', 's', 't', 'c', 'o', 'm', 'c', 'o', 'r', 'p', '.', 'n', 'e', 't', '\0', /* "fastconfirm.com", true */ 'f', 'a', 's', 't', 'c', 'o', 'n', 'f', 'i', 'r', 'm', '.', 'c', 'o', 'm', '\0', /* "fastdigitizing.com", true */ 'f', 'a', 's', 't', 'd', 'i', 'g', 'i', 't', 'i', 'z', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "fastforwardthemes.com", true */ 'f', 'a', 's', 't', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 't', 'h', 'e', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "fastmail.com", false */ 'f', 'a', 's', 't', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "fastwebsites.com.br", true */ 'f', 'a', 's', 't', 'w', 'e', 'b', 's', 'i', 't', 'e', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', - /* "fatox.de", true */ 'f', 'a', 't', 'o', 'x', '.', 'd', 'e', '\0', /* "fatzebra.com.au", false */ 'f', 'a', 't', 'z', 'e', 'b', 'r', 'a', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "faucetbox.com", true */ 'f', 'a', 'u', 'c', 'e', 't', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "favorit.club", true */ 'f', 'a', 'v', 'o', 'r', 'i', 't', '.', 'c', 'l', 'u', 'b', '\0', @@ -5560,6 +5565,7 @@ static const char kSTSHostTable[] = { /* "fierlafijn.net", true */ 'f', 'i', 'e', 'r', 'l', 'a', 'f', 'i', 'j', 'n', '.', 'n', 'e', 't', '\0', /* "fierman.eu", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'e', 'u', '\0', /* "fierman.net", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'n', 'e', 't', '\0', + /* "fierman.us", false */ 'f', 'i', 'e', 'r', 'm', 'a', 'n', '.', 'u', 's', '\0', /* "fight215.com", true */ 'f', 'i', 'g', 'h', 't', '2', '1', '5', '.', 'c', 'o', 'm', '\0', /* "fight215.org", true */ 'f', 'i', 'g', 'h', 't', '2', '1', '5', '.', 'o', 'r', 'g', '\0', /* "figurasdelinguagem.com.br", true */ 'f', 'i', 'g', 'u', 'r', 'a', 's', 'd', 'e', 'l', 'i', 'n', 'g', 'u', 'a', 'g', 'e', 'm', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', @@ -5573,6 +5579,7 @@ static const char kSTSHostTable[] = { /* "filedir.com", false */ 'f', 'i', 'l', 'e', 'd', 'i', 'r', '.', 'c', 'o', 'm', '\0', /* "filesense.com", true */ 'f', 'i', 'l', 'e', 's', 'e', 'n', 's', 'e', '.', 'c', 'o', 'm', '\0', /* "filestar.io", true */ 'f', 'i', 'l', 'e', 's', 't', 'a', 'r', '.', 'i', 'o', '\0', + /* "filey.co.uk", true */ 'f', 'i', 'l', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "filhodohomem.com", true */ 'f', 'i', 'l', 'h', 'o', 'd', 'o', 'h', 'o', 'm', 'e', 'm', '.', 'c', 'o', 'm', '\0', /* "filhomes.ph", true */ 'f', 'i', 'l', 'h', 'o', 'm', 'e', 's', '.', 'p', 'h', '\0', /* "filip-prochazka.com", true */ 'f', 'i', 'l', 'i', 'p', '-', 'p', 'r', 'o', 'c', 'h', 'a', 'z', 'k', 'a', '.', 'c', 'o', 'm', '\0', @@ -5714,9 +5721,9 @@ static const char kSTSHostTable[] = { /* "flowreader.com", true */ 'f', 'l', 'o', 'w', 'r', 'e', 'a', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "flox.io", true */ 'f', 'l', 'o', 'x', '.', 'i', 'o', '\0', /* "flra.gov", true */ 'f', 'l', 'r', 'a', '.', 'g', 'o', 'v', '\0', - /* "flucky.xyz", true */ 'f', 'l', 'u', 'c', 'k', 'y', '.', 'x', 'y', 'z', '\0', /* "fluffycloud.de", true */ 'f', 'l', 'u', 'f', 'f', 'y', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0', /* "fluidojobs.com", true */ 'f', 'l', 'u', 'i', 'd', 'o', 'j', 'o', 'b', 's', '.', 'c', 'o', 'm', '\0', + /* "flukethoughts.com", true */ 'f', 'l', 'u', 'k', 'e', 't', 'h', 'o', 'u', 'g', 'h', 't', 's', '.', 'c', 'o', 'm', '\0', /* "flurrybridge.com", true */ 'f', 'l', 'u', 'r', 'r', 'y', 'b', 'r', 'i', 'd', 'g', 'e', '.', 'c', 'o', 'm', '\0', /* "fluxent.de", false */ 'f', 'l', 'u', 'x', 'e', 'n', 't', '.', 'd', 'e', '\0', /* "fluxfingers.net", true */ 'f', 'l', 'u', 'x', 'f', 'i', 'n', 'g', 'e', 'r', 's', '.', 'n', 'e', 't', '\0', @@ -6152,6 +6159,8 @@ static const char kSTSHostTable[] = { /* "gdutnic.com", true */ 'g', 'd', 'u', 't', 'n', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "gdv.me", true */ 'g', 'd', 'v', '.', 'm', 'e', '\0', /* "gdz-otvety.com", true */ 'g', 'd', 'z', '-', 'o', 't', 'v', 'e', 't', 'y', '.', 'c', 'o', 'm', '\0', + /* "gdz-spishy.com", true */ 'g', 'd', 'z', '-', 's', 'p', 'i', 's', 'h', 'y', '.', 'c', 'o', 'm', '\0', + /* "gdz.tv", true */ 'g', 'd', 'z', '.', 't', 'v', '\0', /* "ge1.me", false */ 'g', 'e', '1', '.', 'm', 'e', '\0', /* "ge3k.net", false */ 'g', 'e', '3', 'k', '.', 'n', 'e', 't', '\0', /* "gear-acquisition-syndrome.community", true */ 'g', 'e', 'a', 'r', '-', 'a', 'c', 'q', 'u', 'i', 's', 'i', 't', 'i', 'o', 'n', '-', 's', 'y', 'n', 'd', 'r', 'o', 'm', 'e', '.', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', '\0', @@ -6212,7 +6221,6 @@ static const char kSTSHostTable[] = { /* "genshiken.org", true */ 'g', 'e', 'n', 's', 'h', 'i', 'k', 'e', 'n', '.', 'o', 'r', 'g', '\0', /* "genslerapps.com", true */ 'g', 'e', 'n', 's', 'l', 'e', 'r', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0', /* "genslerwisp.com", true */ 'g', 'e', 'n', 's', 'l', 'e', 'r', 'w', 'i', 's', 'p', '.', 'c', 'o', 'm', '\0', - /* "gensonline.eu", true */ 'g', 'e', 'n', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'e', 'u', '\0', /* "genuxtsg.com", true */ 'g', 'e', 'n', 'u', 'x', 't', 's', 'g', '.', 'c', 'o', 'm', '\0', /* "genxbeats.com", true */ 'g', 'e', 'n', 'x', 'b', 'e', 'a', 't', 's', '.', 'c', 'o', 'm', '\0', /* "genxnotes.com", true */ 'g', 'e', 'n', 'x', 'n', 'o', 't', 'e', 's', '.', 'c', 'o', 'm', '\0', @@ -6678,7 +6686,6 @@ static const char kSTSHostTable[] = { /* "gus.host", true */ 'g', 'u', 's', '.', 'h', 'o', 's', 't', '\0', /* "gus.moe", true */ 'g', 'u', 's', '.', 'm', 'o', 'e', '\0', /* "guscaplan.me", true */ 'g', 'u', 's', 'c', 'a', 'p', 'l', 'a', 'n', '.', 'm', 'e', '\0', - /* "guso.site", true */ 'g', 'u', 's', 'o', '.', 's', 'i', 't', 'e', '\0', /* "guso.tech", true */ 'g', 'u', 's', 'o', '.', 't', 'e', 'c', 'h', '\0', /* "guthabenkarten-billiger.de", true */ 'g', 'u', 't', 'h', 'a', 'b', 'e', 'n', 'k', 'a', 'r', 't', 'e', 'n', '-', 'b', 'i', 'l', 'l', 'i', 'g', 'e', 'r', '.', 'd', 'e', '\0', /* "guts.me", true */ 'g', 'u', 't', 's', '.', 'm', 'e', '\0', @@ -6710,7 +6717,6 @@ static const char kSTSHostTable[] = { /* "h-rickroll-n.pw", true */ 'h', '-', 'r', 'i', 'c', 'k', 'r', 'o', 'l', 'l', '-', 'n', '.', 'p', 'w', '\0', /* "h11.io", true */ 'h', '1', '1', '.', 'i', 'o', '\0', /* "h11.moe", true */ 'h', '1', '1', '.', 'm', 'o', 'e', '\0', - /* "h3artbl33d.nl", true */ 'h', '3', 'a', 'r', 't', 'b', 'l', '3', '3', 'd', '.', 'n', 'l', '\0', /* "h404bi.com", false */ 'h', '4', '0', '4', 'b', 'i', '.', 'c', 'o', 'm', '\0', /* "haavard.me", true */ 'h', 'a', 'a', 'v', 'a', 'r', 'd', '.', 'm', 'e', '\0', /* "habarisoft.com", true */ 'h', 'a', 'b', 'a', 'r', 'i', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '\0', @@ -6908,6 +6914,7 @@ static const char kSTSHostTable[] = { /* "hearty.space", true */ 'h', 'e', 'a', 'r', 't', 'y', '.', 's', 'p', 'a', 'c', 'e', '\0', /* "hearty.tw", true */ 'h', 'e', 'a', 'r', 't', 'y', '.', 't', 'w', '\0', /* "heartyme.net", true */ 'h', 'e', 'a', 'r', 't', 'y', 'm', 'e', '.', 'n', 'e', 't', '\0', + /* "heathmanners.com", true */ 'h', 'e', 'a', 't', 'h', 'm', 'a', 'n', 'n', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "heavenlysmokenc.com", true */ 'h', 'e', 'a', 'v', 'e', 'n', 'l', 'y', 's', 'm', 'o', 'k', 'e', 'n', 'c', '.', 'c', 'o', 'm', '\0', /* "heavensattic.co.uk", true */ 'h', 'e', 'a', 'v', 'e', 'n', 's', 'a', 't', 't', 'i', 'c', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "heavensinferno.net", true */ 'h', 'e', 'a', 'v', 'e', 'n', 's', 'i', 'n', 'f', 'e', 'r', 'n', 'o', '.', 'n', 'e', 't', '\0', @@ -7042,6 +7049,7 @@ static const char kSTSHostTable[] = { /* "higherpress.org", true */ 'h', 'i', 'g', 'h', 'e', 'r', 'p', 'r', 'e', 's', 's', '.', 'o', 'r', 'g', '\0', /* "higilopocht.li", true */ 'h', 'i', 'g', 'i', 'l', 'o', 'p', 'o', 'c', 'h', 't', '.', 'l', 'i', '\0', /* "higp.de", true */ 'h', 'i', 'g', 'p', '.', 'd', 'e', '\0', + /* "hiisukun.com", true */ 'h', 'i', 'i', 's', 'u', 'k', 'u', 'n', '.', 'c', 'o', 'm', '\0', /* "hike.pics", true */ 'h', 'i', 'k', 'e', '.', 'p', 'i', 'c', 's', '\0', /* "hilahdih.cz", true */ 'h', 'i', 'l', 'a', 'h', 'd', 'i', 'h', '.', 'c', 'z', '\0', /* "hilaolu.com", true */ 'h', 'i', 'l', 'a', 'o', 'l', 'u', '.', 'c', 'o', 'm', '\0', @@ -7058,7 +7066,6 @@ static const char kSTSHostTable[] = { /* "hintergrundbewegung.de", true */ 'h', 'i', 'n', 't', 'e', 'r', 'g', 'r', 'u', 'n', 'd', 'b', 'e', 'w', 'e', 'g', 'u', 'n', 'g', '.', 'd', 'e', '\0', /* "hinterhofbu.de", true */ 'h', 'i', 'n', 't', 'e', 'r', 'h', 'o', 'f', 'b', 'u', '.', 'd', 'e', '\0', /* "hintermeier-rae.at", true */ 'h', 'i', 'n', 't', 'e', 'r', 'm', 'e', 'i', 'e', 'r', '-', 'r', 'a', 'e', '.', 'a', 't', '\0', - /* "hintss.pw", true */ 'h', 'i', 'n', 't', 's', 's', '.', 'p', 'w', '\0', /* "hippies.com.br", true */ 'h', 'i', 'p', 'p', 'i', 'e', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "hipstercat.fr", true */ 'h', 'i', 'p', 's', 't', 'e', 'r', 'c', 'a', 't', '.', 'f', 'r', '\0', /* "hiqfleet.co.uk", true */ 'h', 'i', 'q', 'f', 'l', 'e', 'e', 't', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -7422,7 +7429,6 @@ static const char kSTSHostTable[] = { /* "idexxpublicationportal.com", true */ 'i', 'd', 'e', 'x', 'x', 'p', 'u', 'b', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', 'p', 'o', 'r', 't', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "idgard.de", true */ 'i', 'd', 'g', 'a', 'r', 'd', '.', 'd', 'e', '\0', /* "idid.tk", true */ 'i', 'd', 'i', 'd', '.', 't', 'k', '\0', - /* "idinby.dk", true */ 'i', 'd', 'i', 'n', 'b', 'y', '.', 'd', 'k', '\0', /* "idiopolis.org", true */ 'i', 'd', 'i', 'o', 'p', 'o', 'l', 'i', 's', '.', 'o', 'r', 'g', '\0', /* "idisplay.es", true */ 'i', 'd', 'i', 's', 'p', 'l', 'a', 'y', '.', 'e', 's', '\0', /* "idmobile.co.uk", true */ 'i', 'd', 'm', 'o', 'b', 'i', 'l', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -7562,7 +7568,6 @@ static const char kSTSHostTable[] = { /* "imokuri123.com", true */ 'i', 'm', 'o', 'k', 'u', 'r', 'i', '1', '2', '3', '.', 'c', 'o', 'm', '\0', /* "imoner.ga", true */ 'i', 'm', 'o', 'n', 'e', 'r', '.', 'g', 'a', '\0', /* "imoni-blog.net", true */ 'i', 'm', 'o', 'n', 'i', '-', 'b', 'l', 'o', 'g', '.', 'n', 'e', 't', '\0', - /* "imoto.me", true */ 'i', 'm', 'o', 't', 'o', '.', 'm', 'e', '\0', /* "imouyang.com", true */ 'i', 'm', 'o', 'u', 'y', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "impact.health.nz", true */ 'i', 'm', 'p', 'a', 'c', 't', '.', 'h', 'e', 'a', 'l', 't', 'h', '.', 'n', 'z', '\0', /* "impex.com.bd", true */ 'i', 'm', 'p', 'e', 'x', '.', 'c', 'o', 'm', '.', 'b', 'd', '\0', @@ -7629,6 +7634,7 @@ static const char kSTSHostTable[] = { /* "info-beamer.com", true */ 'i', 'n', 'f', 'o', '-', 'b', 'e', 'a', 'm', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "info-screen.me", true */ 'i', 'n', 'f', 'o', '-', 's', 'c', 'r', 'e', 'e', 'n', '.', 'm', 'e', '\0', /* "info-screw.com", true */ 'i', 'n', 'f', 'o', '-', 's', 'c', 'r', 'e', 'w', '.', 'c', 'o', 'm', '\0', + /* "info-sys.tk", true */ 'i', 'n', 'f', 'o', '-', 's', 'y', 's', '.', 't', 'k', '\0', /* "infocommsociety.com", true */ 'i', 'n', 'f', 'o', 'c', 'o', 'm', 'm', 's', 'o', 'c', 'i', 'e', 't', 'y', '.', 'c', 'o', 'm', '\0', /* "infoduv.fr", true */ 'i', 'n', 'f', 'o', 'd', 'u', 'v', '.', 'f', 'r', '\0', /* "infopier.sg", true */ 'i', 'n', 'f', 'o', 'p', 'i', 'e', 'r', '.', 's', 'g', '\0', @@ -7729,6 +7735,7 @@ static const char kSTSHostTable[] = { /* "intermedinet.nl", true */ 'i', 'n', 't', 'e', 'r', 'm', 'e', 'd', 'i', 'n', 'e', 't', '.', 'n', 'l', '\0', /* "internaldh.com", true */ 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'd', 'h', '.', 'c', 'o', 'm', '\0', /* "internaut.co.za", true */ 'i', 'n', 't', 'e', 'r', 'n', 'a', 'u', 't', '.', 'c', 'o', '.', 'z', 'a', '\0', + /* "internect.co.za", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 'c', 't', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "internet-pornografie.de", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', '-', 'p', 'o', 'r', 'n', 'o', 'g', 'r', 'a', 'f', 'i', 'e', '.', 'd', 'e', '\0', /* "internetbank.swedbank.se", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'b', 'a', 'n', 'k', '.', 's', 'w', 'e', 'd', 'b', 'a', 'n', 'k', '.', 's', 'e', '\0', /* "internetbugbounty.org", true */ 'i', 'n', 't', 'e', 'r', 'n', 'e', 't', 'b', 'u', 'g', 'b', 'o', 'u', 'n', 't', 'y', '.', 'o', 'r', 'g', '\0', @@ -7790,6 +7797,7 @@ static const char kSTSHostTable[] = { /* "ioover.net", true */ 'i', 'o', 'o', 'v', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "iossifovlab.com", true */ 'i', 'o', 's', 's', 'i', 'f', 'o', 'v', 'l', 'a', 'b', '.', 'c', 'o', 'm', '\0', /* "ioteo.com", true */ 'i', 'o', 't', 'e', 'o', '.', 'c', 'o', 'm', '\0', + /* "ip-life.net", true */ 'i', 'p', '-', 'l', 'i', 'f', 'e', '.', 'n', 'e', 't', '\0', /* "ip.or.at", true */ 'i', 'p', '.', 'o', 'r', '.', 'a', 't', '\0', /* "ip2country.info", true */ 'i', 'p', '2', 'c', 'o', 'u', 'n', 't', 'r', 'y', '.', 'i', 'n', 'f', 'o', '\0', /* "ip6.li", false */ 'i', 'p', '6', '.', 'l', 'i', '\0', @@ -7880,7 +7888,6 @@ static const char kSTSHostTable[] = { /* "isntall.us", true */ 'i', 's', 'n', 't', 'a', 'l', 'l', '.', 'u', 's', '\0', /* "isocom.eu", true */ 'i', 's', 'o', 'c', 'o', 'm', '.', 'e', 'u', '\0', /* "isoface33.fr", true */ 'i', 's', 'o', 'f', 'a', 'c', 'e', '3', '3', '.', 'f', 'r', '\0', - /* "isogen5.com", true */ 'i', 's', 'o', 'g', 'e', 'n', '5', '.', 'c', 'o', 'm', '\0', /* "isognattori.com", true */ 'i', 's', 'o', 'g', 'n', 'a', 't', 't', 'o', 'r', 'i', '.', 'c', 'o', 'm', '\0', /* "isolta.com", true */ 'i', 's', 'o', 'l', 't', 'a', '.', 'c', 'o', 'm', '\0', /* "isolta.de", true */ 'i', 's', 'o', 'l', 't', 'a', '.', 'd', 'e', '\0', @@ -7959,6 +7966,7 @@ static const char kSTSHostTable[] = { /* "itsgoingdown.org", true */ 'i', 't', 's', 'g', 'o', 'i', 'n', 'g', 'd', 'o', 'w', 'n', '.', 'o', 'r', 'g', '\0', /* "itskayla.com", false */ 'i', 't', 's', 'k', 'a', 'y', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "itsok.de", true */ 'i', 't', 's', 'o', 'k', '.', 'd', 'e', '\0', + /* "itspawned.com", true */ 'i', 't', 's', 'p', 'a', 'w', 'n', 'e', 'd', '.', 'c', 'o', 'm', '\0', /* "itspersonaltraining.nl", true */ 'i', 't', 's', 'p', 'e', 'r', 's', 'o', 'n', 'a', 'l', 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '.', 'n', 'l', '\0', /* "itsryan.com", false */ 'i', 't', 's', 'r', 'y', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "itsstefan.eu", true */ 'i', 't', 's', 's', 't', 'e', 'f', 'a', 'n', '.', 'e', 'u', '\0', @@ -8203,7 +8211,7 @@ static const char kSTSHostTable[] = { /* "jie.dance", true */ 'j', 'i', 'e', '.', 'd', 'a', 'n', 'c', 'e', '\0', /* "jigsawdevelopments.com", true */ 'j', 'i', 'g', 's', 'a', 'w', 'd', 'e', 'v', 'e', 'l', 'o', 'p', 'm', 'e', 'n', 't', 's', '.', 'c', 'o', 'm', '\0', /* "jimbraaten.com", true */ 'j', 'i', 'm', 'b', 'r', 'a', 'a', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0', - /* "jimmehcai.com", false */ 'j', 'i', 'm', 'm', 'e', 'h', 'c', 'a', 'i', '.', 'c', 'o', 'm', '\0', + /* "jimmehcai.com", true */ 'j', 'i', 'm', 'm', 'e', 'h', 'c', 'a', 'i', '.', 'c', 'o', 'm', '\0', /* "jimshaver.net", true */ 'j', 'i', 'm', 's', 'h', 'a', 'v', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "jinancy.fr", true */ 'j', 'i', 'n', 'a', 'n', 'c', 'y', '.', 'f', 'r', '\0', /* "jinbo123.com", false */ 'j', 'i', 'n', 'b', 'o', '1', '2', '3', '.', 'c', 'o', 'm', '\0', @@ -8377,7 +8385,6 @@ static const char kSTSHostTable[] = { /* "juliansimioni.com", true */ 'j', 'u', 'l', 'i', 'a', 'n', 's', 'i', 'm', 'i', 'o', 'n', 'i', '.', 'c', 'o', 'm', '\0', /* "julianvmodesto.com", true */ 'j', 'u', 'l', 'i', 'a', 'n', 'v', 'm', 'o', 'd', 'e', 's', 't', 'o', '.', 'c', 'o', 'm', '\0', /* "julibear.com", true */ 'j', 'u', 'l', 'i', 'b', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0', - /* "julido.de", true */ 'j', 'u', 'l', 'i', 'd', 'o', '.', 'd', 'e', '\0', /* "juliekoubova.net", true */ 'j', 'u', 'l', 'i', 'e', 'k', 'o', 'u', 'b', 'o', 'v', 'a', '.', 'n', 'e', 't', '\0', /* "juliemaurel.fr", true */ 'j', 'u', 'l', 'i', 'e', 'm', 'a', 'u', 'r', 'e', 'l', '.', 'f', 'r', '\0', /* "julienc.io", true */ 'j', 'u', 'l', 'i', 'e', 'n', 'c', '.', 'i', 'o', '\0', @@ -8457,6 +8464,7 @@ static const char kSTSHostTable[] = { /* "kakao-karten.de", true */ 'k', 'a', 'k', 'a', 'o', '-', 'k', 'a', 'r', 't', 'e', 'n', '.', 'd', 'e', '\0', /* "kakaomilchkuh.de", true */ 'k', 'a', 'k', 'a', 'o', 'm', 'i', 'l', 'c', 'h', 'k', 'u', 'h', '.', 'd', 'e', '\0', /* "kakaravaara.fi", true */ 'k', 'a', 'k', 'a', 'r', 'a', 'v', 'a', 'a', 'r', 'a', '.', 'f', 'i', '\0', + /* "kaketalk.com", true */ 'k', 'a', 'k', 'e', 't', 'a', 'l', 'k', '.', 'c', 'o', 'm', '\0', /* "kaleidomarketing.com", true */ 'k', 'a', 'l', 'e', 'i', 'd', 'o', 'm', 'a', 'r', 'k', 'e', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "kalender.com", true */ 'k', 'a', 'l', 'e', 'n', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "kalevlamps.co.uk", true */ 'k', 'a', 'l', 'e', 'v', 'l', 'a', 'm', 'p', 's', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -8506,6 +8514,7 @@ static const char kSTSHostTable[] = { /* "kardize24.pl", true */ 'k', 'a', 'r', 'd', 'i', 'z', 'e', '2', '4', '.', 'p', 'l', '\0', /* "karguine.in", true */ 'k', 'a', 'r', 'g', 'u', 'i', 'n', 'e', '.', 'i', 'n', '\0', /* "karhm.com", true */ 'k', 'a', 'r', 'h', 'm', '.', 'c', 'o', 'm', '\0', + /* "karhukamera.com", true */ 'k', 'a', 'r', 'h', 'u', 'k', 'a', 'm', 'e', 'r', 'a', '.', 'c', 'o', 'm', '\0', /* "karit.nz", true */ 'k', 'a', 'r', 'i', 't', '.', 'n', 'z', '\0', /* "karlstabo.se", true */ 'k', 'a', 'r', 'l', 's', 't', 'a', 'b', 'o', '.', 's', 'e', '\0', /* "karmaassurance.ca", true */ 'k', 'a', 'r', 'm', 'a', 'a', 's', 's', 'u', 'r', 'a', 'n', 'c', 'e', '.', 'c', 'a', '\0', @@ -8687,6 +8696,7 @@ static const char kSTSHostTable[] = { /* "kinderopvangengeltjes.nl", true */ 'k', 'i', 'n', 'd', 'e', 'r', 'o', 'p', 'v', 'a', 'n', 'g', 'e', 'n', 'g', 'e', 'l', 't', 'j', 'e', 's', '.', 'n', 'l', '\0', /* "kindleworth.com", true */ 'k', 'i', 'n', 'd', 'l', 'e', 'w', 'o', 'r', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "kindlyfire.com", true */ 'k', 'i', 'n', 'd', 'l', 'y', 'f', 'i', 'r', 'e', '.', 'c', 'o', 'm', '\0', + /* "kindof.ninja", true */ 'k', 'i', 'n', 'd', 'o', 'f', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "kinepolis-studio.ga", true */ 'k', 'i', 'n', 'e', 'p', 'o', 'l', 'i', 's', '-', 's', 't', 'u', 'd', 'i', 'o', '.', 'g', 'a', '\0', /* "kingant.net", true */ 'k', 'i', 'n', 'g', 'a', 'n', 't', '.', 'n', 'e', 't', '\0', /* "kinganywhere.eu", true */ 'k', 'i', 'n', 'g', 'a', 'n', 'y', 'w', 'h', 'e', 'r', 'e', '.', 'e', 'u', '\0', @@ -8929,6 +8939,7 @@ static const char kSTSHostTable[] = { /* "kretschmann.consulting", true */ 'k', 'r', 'e', 't', 's', 'c', 'h', 'm', 'a', 'n', 'n', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0', /* "kreuzpfadfinder.de", true */ 'k', 'r', 'e', 'u', 'z', 'p', 'f', 'a', 'd', 'f', 'i', 'n', 'd', 'e', 'r', '.', 'd', 'e', '\0', /* "kriechel.de", true */ 'k', 'r', 'i', 'e', 'c', 'h', 'e', 'l', '.', 'd', 'e', '\0', + /* "kriegskindernothilfe.de", true */ 'k', 'r', 'i', 'e', 'g', 's', 'k', 'i', 'n', 'd', 'e', 'r', 'n', 'o', 't', 'h', 'i', 'l', 'f', 'e', '.', 'd', 'e', '\0', /* "kriptosec.com", true */ 'k', 'r', 'i', 'p', 't', 'o', 's', 'e', 'c', '.', 'c', 'o', 'm', '\0', /* "krislamoureux.com", true */ 'k', 'r', 'i', 's', 'l', 'a', 'm', 'o', 'u', 'r', 'e', 'u', 'x', '.', 'c', 'o', 'm', '\0', /* "krisstarkey.co.uk", true */ 'k', 'r', 'i', 's', 's', 't', 'a', 'r', 'k', 'e', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', @@ -8937,6 +8948,7 @@ static const char kSTSHostTable[] = { /* "kristjanrang.eu", true */ 'k', 'r', 'i', 's', 't', 'j', 'a', 'n', 'r', 'a', 'n', 'g', '.', 'e', 'u', '\0', /* "kristofferkoch.com", true */ 'k', 'r', 'i', 's', 't', 'o', 'f', 'f', 'e', 'r', 'k', 'o', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "krizek.cc", true */ 'k', 'r', 'i', 'z', 'e', 'k', '.', 'c', 'c', '\0', + /* "krizevackapajdasija.hr", true */ 'k', 'r', 'i', 'z', 'e', 'v', 'a', 'c', 'k', 'a', 'p', 'a', 'j', 'd', 'a', 's', 'i', 'j', 'a', '.', 'h', 'r', '\0', /* "krk-media.pl", false */ 'k', 'r', 'k', '-', 'm', 'e', 'd', 'i', 'a', '.', 'p', 'l', '\0', /* "krmela.com", true */ 'k', 'r', 'm', 'e', 'l', 'a', '.', 'c', 'o', 'm', '\0', /* "krmeni.cz", true */ 'k', 'r', 'm', 'e', 'n', 'i', '.', 'c', 'z', '\0', @@ -9029,7 +9041,6 @@ static const char kSTSHostTable[] = { /* "kyoto-tomikawa.jp", true */ 'k', 'y', 'o', 't', 'o', '-', 't', 'o', 'm', 'i', 'k', 'a', 'w', 'a', '.', 'j', 'p', '\0', /* "kyujin-office.net", true */ 'k', 'y', 'u', 'j', 'i', 'n', '-', 'o', 'f', 'f', 'i', 'c', 'e', '.', 'n', 'e', 't', '\0', /* "kyy.me", true */ 'k', 'y', 'y', '.', 'm', 'e', '\0', - /* "kzsdabas.hu", true */ 'k', 'z', 's', 'd', 'a', 'b', 'a', 's', '.', 'h', 'u', '\0', /* "l-lab.org", true */ 'l', '-', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0', /* "l-rickroll-i.pw", true */ 'l', '-', 'r', 'i', 'c', 'k', 'r', 'o', 'l', 'l', '-', 'i', '.', 'p', 'w', '\0', /* "l18.io", true */ 'l', '1', '8', '.', 'i', 'o', '\0', @@ -9099,6 +9110,7 @@ static const char kSTSHostTable[] = { /* "landofelves.net", true */ 'l', 'a', 'n', 'd', 'o', 'f', 'e', 'l', 'v', 'e', 's', '.', 'n', 'e', 't', '\0', /* "landscapingmedic.com", true */ 'l', 'a', 'n', 'd', 's', 'c', 'a', 'p', 'i', 'n', 'g', 'm', 'e', 'd', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "langatang.com", true */ 'l', 'a', 'n', 'g', 'a', 't', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0', + /* "langbein.org", true */ 'l', 'a', 'n', 'g', 'b', 'e', 'i', 'n', '.', 'o', 'r', 'g', '\0', /* "langendries.eu", true */ 'l', 'a', 'n', 'g', 'e', 'n', 'd', 'r', 'i', 'e', 's', '.', 'e', 'u', '\0', /* "langguth.io", true */ 'l', 'a', 'n', 'g', 'g', 'u', 't', 'h', '.', 'i', 'o', '\0', /* "langkahteduh.com", true */ 'l', 'a', 'n', 'g', 'k', 'a', 'h', 't', 'e', 'd', 'u', 'h', '.', 'c', 'o', 'm', '\0', @@ -9287,7 +9299,6 @@ static const char kSTSHostTable[] = { /* "leonmahler.consulting", true */ 'l', 'e', 'o', 'n', 'm', 'a', 'h', 'l', 'e', 'r', '.', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '\0', /* "leopoldina.net", true */ 'l', 'e', 'o', 'p', 'o', 'l', 'd', 'i', 'n', 'a', '.', 'n', 'e', 't', '\0', /* "lep.gov", true */ 'l', 'e', 'p', '.', 'g', 'o', 'v', '\0', - /* "leppis-it.de", true */ 'l', 'e', 'p', 'p', 'i', 's', '-', 'i', 't', '.', 'd', 'e', '\0', /* "leprado.com", true */ 'l', 'e', 'p', 'r', 'a', 'd', 'o', '.', 'c', 'o', 'm', '\0', /* "lerasenglish.com", true */ 'l', 'e', 'r', 'a', 's', 'e', 'n', 'g', 'l', 'i', 's', 'h', '.', 'c', 'o', 'm', '\0', /* "lereporter.ma", true */ 'l', 'e', 'r', 'e', 'p', 'o', 'r', 't', 'e', 'r', '.', 'm', 'a', '\0', @@ -9544,7 +9555,6 @@ static const char kSTSHostTable[] = { /* "localbitcoins.com", true */ 'l', 'o', 'c', 'a', 'l', 'b', 'i', 't', 'c', 'o', 'i', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "localblock.co.za", true */ 'l', 'o', 'c', 'a', 'l', 'b', 'l', 'o', 'c', 'k', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "localdrive.me", true */ 'l', 'o', 'c', 'a', 'l', 'd', 'r', 'i', 'v', 'e', '.', 'm', 'e', '\0', - /* "localhorst.xyz", true */ 'l', 'o', 'c', 'a', 'l', 'h', 'o', 'r', 's', 't', '.', 'x', 'y', 'z', '\0', /* "localnetwork.nz", true */ 'l', 'o', 'c', 'a', 'l', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'n', 'z', '\0', /* "localspot.pl", true */ 'l', 'o', 'c', 'a', 'l', 's', 'p', 'o', 't', '.', 'p', 'l', '\0', /* "locatorplus.gov", true */ 'l', 'o', 'c', 'a', 't', 'o', 'r', 'p', 'l', 'u', 's', '.', 'g', 'o', 'v', '\0', @@ -9558,7 +9568,6 @@ static const char kSTSHostTable[] = { /* "lodash.com", false */ 'l', 'o', 'd', 'a', 's', 'h', '.', 'c', 'o', 'm', '\0', /* "loenshotel.de", true */ 'l', 'o', 'e', 'n', 's', 'h', 'o', 't', 'e', 'l', '.', 'd', 'e', '\0', /* "loforo.com", true */ 'l', 'o', 'f', 'o', 'r', 'o', '.', 'c', 'o', 'm', '\0', - /* "loftboard.eu", true */ 'l', 'o', 'f', 't', 'b', 'o', 'a', 'r', 'd', '.', 'e', 'u', '\0', /* "lofttravel.com", true */ 'l', 'o', 'f', 't', 't', 'r', 'a', 'v', 'e', 'l', '.', 'c', 'o', 'm', '\0', /* "log.my", true */ 'l', 'o', 'g', '.', 'm', 'y', '\0', /* "logaldeveloper.com", true */ 'l', 'o', 'g', 'a', 'l', 'd', 'e', 'v', 'e', 'l', 'o', 'p', 'e', 'r', '.', 'c', 'o', 'm', '\0', @@ -9599,6 +9608,7 @@ static const char kSTSHostTable[] = { /* "loli.pet", true */ 'l', 'o', 'l', 'i', '.', 'p', 'e', 't', '\0', /* "lolicon.eu", true */ 'l', 'o', 'l', 'i', 'c', 'o', 'n', '.', 'e', 'u', '\0', /* "lolkot.ru", true */ 'l', 'o', 'l', 'k', 'o', 't', '.', 'r', 'u', '\0', + /* "lolmegafroi.de", true */ 'l', 'o', 'l', 'm', 'e', 'g', 'a', 'f', 'r', 'o', 'i', '.', 'd', 'e', '\0', /* "lolpatrol.de", true */ 'l', 'o', 'l', 'p', 'a', 't', 'r', 'o', 'l', '.', 'd', 'e', '\0', /* "lolpatrol.wtf", true */ 'l', 'o', 'l', 'p', 'a', 't', 'r', 'o', 'l', '.', 'w', 't', 'f', '\0', /* "lona.io", true */ 'l', 'o', 'n', 'a', '.', 'i', 'o', '\0', @@ -9642,7 +9652,6 @@ static const char kSTSHostTable[] = { /* "lottosonline.com", true */ 'l', 'o', 't', 't', 'o', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "lotw.de", true */ 'l', 'o', 't', 'w', '.', 'd', 'e', '\0', /* "loucanfixit.com", true */ 'l', 'o', 'u', 'c', 'a', 'n', 'f', 'i', 'x', 'i', 't', '.', 'c', 'o', 'm', '\0', - /* "louiewatch.com", true */ 'l', 'o', 'u', 'i', 'e', 'w', 'a', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "louisvillevmug.info", true */ 'l', 'o', 'u', 'i', 's', 'v', 'i', 'l', 'l', 'e', 'v', 'm', 'u', 'g', '.', 'i', 'n', 'f', 'o', '\0', /* "loune.net", true */ 'l', 'o', 'u', 'n', 'e', '.', 'n', 'e', 't', '\0', /* "love-schna.jp", true */ 'l', 'o', 'v', 'e', '-', 's', 'c', 'h', 'n', 'a', '.', 'j', 'p', '\0', @@ -9714,7 +9723,6 @@ static const char kSTSHostTable[] = { /* "lukaszdolan.com", true */ 'l', 'u', 'k', 'a', 's', 'z', 'd', 'o', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "lukasztkacz.com", true */ 'l', 'u', 'k', 'a', 's', 'z', 't', 'k', 'a', 'c', 'z', '.', 'c', 'o', 'm', '\0', /* "luke.ch", true */ 'l', 'u', 'k', 'e', '.', 'c', 'h', '\0', - /* "lukeng.net", true */ 'l', 'u', 'k', 'e', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "luludapomerania.com", true */ 'l', 'u', 'l', 'u', 'd', 'a', 'p', 'o', 'm', 'e', 'r', 'a', 'n', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "lumiere.com", true */ 'l', 'u', 'm', 'i', 'e', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "lunafag.ru", true */ 'l', 'u', 'n', 'a', 'f', 'a', 'g', '.', 'r', 'u', '\0', @@ -9830,6 +9838,7 @@ static const char kSTSHostTable[] = { /* "mahefa.co.uk", true */ 'm', 'a', 'h', 'e', 'f', 'a', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "mahfouzadedimeji.com", true */ 'm', 'a', 'h', 'f', 'o', 'u', 'z', 'a', 'd', 'e', 'd', 'i', 'm', 'e', 'j', 'i', '.', 'c', 'o', 'm', '\0', /* "mahrer.net", true */ 'm', 'a', 'h', 'r', 'e', 'r', '.', 'n', 'e', 't', '\0', + /* "maidofhonorcleaning.net", true */ 'm', 'a', 'i', 'd', 'o', 'f', 'h', 'o', 'n', 'o', 'r', 'c', 'l', 'e', 'a', 'n', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "mail-rotter.de", true */ 'm', 'a', 'i', 'l', '-', 'r', 'o', 't', 't', 'e', 'r', '.', 'd', 'e', '\0', /* "mail-settings.google.com", true */ 'm', 'a', 'i', 'l', '-', 's', 'e', 't', 't', 'i', 'n', 'g', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "mail.de", true */ 'm', 'a', 'i', 'l', '.', 'd', 'e', '\0', @@ -9863,6 +9872,7 @@ static const char kSTSHostTable[] = { /* "make-pizza.info", true */ 'm', 'a', 'k', 'e', '-', 'p', 'i', 'z', 'z', 'a', '.', 'i', 'n', 'f', 'o', '\0', /* "makedin.net", true */ 'm', 'a', 'k', 'e', 'd', 'i', 'n', '.', 'n', 'e', 't', '\0', /* "makeuplove.nl", true */ 'm', 'a', 'k', 'e', 'u', 'p', 'l', 'o', 'v', 'e', '.', 'n', 'l', '\0', + /* "makeyourank.com", true */ 'm', 'a', 'k', 'e', 'y', 'o', 'u', 'r', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', /* "makeyourlaws.org", true */ 'm', 'a', 'k', 'e', 'y', 'o', 'u', 'r', 'l', 'a', 'w', 's', '.', 'o', 'r', 'g', '\0', /* "makinen.ru", true */ 'm', 'a', 'k', 'i', 'n', 'e', 'n', '.', 'r', 'u', '\0', /* "makkusu.photo", true */ 'm', 'a', 'k', 'k', 'u', 's', 'u', '.', 'p', 'h', 'o', 't', 'o', '\0', @@ -10246,6 +10256,7 @@ static const char kSTSHostTable[] = { /* "mehmetince.net", true */ 'm', 'e', 'h', 'm', 'e', 't', 'i', 'n', 'c', 'e', '.', 'n', 'e', 't', '\0', /* "mehostdd.com", true */ 'm', 'e', 'h', 'o', 's', 't', 'd', 'd', '.', 'c', 'o', 'm', '\0', /* "mehrwert.de", true */ 'm', 'e', 'h', 'r', 'w', 'e', 'r', 't', '.', 'd', 'e', '\0', + /* "meifrench.com", true */ 'm', 'e', 'i', 'f', 'r', 'e', 'n', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "meikan.moe", true */ 'm', 'e', 'i', 'k', 'a', 'n', '.', 'm', 'o', 'e', '\0', /* "meillard-auto-ecole.ch", true */ 'm', 'e', 'i', 'l', 'l', 'a', 'r', 'd', '-', 'a', 'u', 't', 'o', '-', 'e', 'c', 'o', 'l', 'e', '.', 'c', 'h', '\0', /* "mein-webportal.de", true */ 'm', 'e', 'i', 'n', '-', 'w', 'e', 'b', 'p', 'o', 'r', 't', 'a', 'l', '.', 'd', 'e', '\0', @@ -10284,7 +10295,6 @@ static const char kSTSHostTable[] = { /* "memo-linux.com", true */ 'm', 'e', 'm', 'o', '-', 'l', 'i', 'n', 'u', 'x', '.', 'c', 'o', 'm', '\0', /* "memoire-resistance-ariege.fr", true */ 'm', 'e', 'm', 'o', 'i', 'r', 'e', '-', 'r', 'e', 's', 'i', 's', 't', 'a', 'n', 'c', 'e', '-', 'a', 'r', 'i', 'e', 'g', 'e', '.', 'f', 'r', '\0', /* "memoryex.net", true */ 'm', 'e', 'm', 'o', 'r', 'y', 'e', 'x', '.', 'n', 'e', 't', '\0', - /* "menaraannonces.com", true */ 'm', 'e', 'n', 'a', 'r', 'a', 'a', 'n', 'n', 'o', 'n', 'c', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "mendy.jp", true */ 'm', 'e', 'n', 'd', 'y', '.', 'j', 'p', '\0', /* "menielias.com", true */ 'm', 'e', 'n', 'i', 'e', 'l', 'i', 'a', 's', '.', 'c', 'o', 'm', '\0', /* "menkyo-blog.com", true */ 'm', 'e', 'n', 'k', 'y', 'o', '-', 'b', 'l', 'o', 'g', '.', 'c', 'o', 'm', '\0', @@ -10342,7 +10352,7 @@ static const char kSTSHostTable[] = { /* "mexican.dating", true */ 'm', 'e', 'x', 'i', 'c', 'a', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "mexior.nl", true */ 'm', 'e', 'x', 'i', 'o', 'r', '.', 'n', 'l', '\0', /* "meyeraviation.com", true */ 'm', 'e', 'y', 'e', 'r', 'a', 'v', 'i', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', - /* "mfedderke.com", true */ 'm', 'f', 'e', 'd', 'd', 'e', 'r', 'k', 'e', '.', 'c', 'o', 'm', '\0', + /* "meyercloud.de", true */ 'm', 'e', 'y', 'e', 'r', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0', /* "mfxbe.de", true */ 'm', 'f', 'x', 'b', 'e', '.', 'd', 'e', '\0', /* "mgdigital.fr", true */ 'm', 'g', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'f', 'r', '\0', /* "mghiorzi.com.ar", true */ 'm', 'g', 'h', 'i', 'o', 'r', 'z', 'i', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', @@ -10608,6 +10618,7 @@ static const char kSTSHostTable[] = { /* "modafinil.com", true */ 'm', 'o', 'd', 'a', 'f', 'i', 'n', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "modafinil.wiki", true */ 'm', 'o', 'd', 'a', 'f', 'i', 'n', 'i', 'l', '.', 'w', 'i', 'k', 'i', '\0', /* "modded-minecraft-server-list.com", true */ 'm', 'o', 'd', 'd', 'e', 'd', '-', 'm', 'i', 'n', 'e', 'c', 'r', 'a', 'f', 't', '-', 's', 'e', 'r', 'v', 'e', 'r', '-', 'l', 'i', 's', 't', '.', 'c', 'o', 'm', '\0', + /* "moddedark.com", true */ 'm', 'o', 'd', 'd', 'e', 'd', 'a', 'r', 'k', '.', 'c', 'o', 'm', '\0', /* "mode-individuell.de", true */ 'm', 'o', 'd', 'e', '-', 'i', 'n', 'd', 'i', 'v', 'i', 'd', 'u', 'e', 'l', 'l', '.', 'd', 'e', '\0', /* "mode-marine.com", true */ 'm', 'o', 'd', 'e', '-', 'm', 'a', 'r', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "modecaso.com", true */ 'm', 'o', 'd', 'e', 'c', 'a', 's', 'o', '.', 'c', 'o', 'm', '\0', @@ -10630,6 +10641,8 @@ static const char kSTSHostTable[] = { /* "moehrke.cc", true */ 'm', 'o', 'e', 'h', 'r', 'k', 'e', '.', 'c', 'c', '\0', /* "moeloli.pw", true */ 'm', 'o', 'e', 'l', 'o', 'l', 'i', '.', 'p', 'w', '\0', /* "moevenpick-cafe.com", true */ 'm', 'o', 'e', 'v', 'e', 'n', 'p', 'i', 'c', 'k', '-', 'c', 'a', 'f', 'e', '.', 'c', 'o', 'm', '\0', + /* "moeyi.xyz", true */ 'm', 'o', 'e', 'y', 'i', '.', 'x', 'y', 'z', '\0', + /* "mofohome.dyndns.org", true */ 'm', 'o', 'f', 'o', 'h', 'o', 'm', 'e', '.', 'd', 'y', 'n', 'd', 'n', 's', '.', 'o', 'r', 'g', '\0', /* "moitur.com", true */ 'm', 'o', 'i', 't', 'u', 'r', '.', 'c', 'o', 'm', '\0', /* "mojaknjiznica.com", false */ 'm', 'o', 'j', 'a', 'k', 'n', 'j', 'i', 'z', 'n', 'i', 'c', 'a', '.', 'c', 'o', 'm', '\0', /* "mojapraca.sk", true */ 'm', 'o', 'j', 'a', 'p', 'r', 'a', 'c', 'a', '.', 's', 'k', '\0', @@ -10656,8 +10669,6 @@ static const char kSTSHostTable[] = { /* "monarcasystems.com", true */ 'm', 'o', 'n', 'a', 'r', 'c', 'a', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0', /* "monautoneuve.fr", true */ 'm', 'o', 'n', 'a', 'u', 't', 'o', 'n', 'e', 'u', 'v', 'e', '.', 'f', 'r', '\0', /* "mondedie.fr", true */ 'm', 'o', 'n', 'd', 'e', 'd', 'i', 'e', '.', 'f', 'r', '\0', - /* "mondwandler.de", true */ 'm', 'o', 'n', 'd', 'w', 'a', 'n', 'd', 'l', 'e', 'r', '.', 'd', 'e', '\0', - /* "moneycrownmedia.com", true */ 'm', 'o', 'n', 'e', 'y', 'c', 'r', 'o', 'w', 'n', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0', /* "moneygo.se", true */ 'm', 'o', 'n', 'e', 'y', 'g', 'o', '.', 's', 'e', '\0', /* "moneyhouse.de", true */ 'm', 'o', 'n', 'e', 'y', 'h', 'o', 'u', 's', 'e', '.', 'd', 'e', '\0', /* "monika-sokol.de", true */ 'm', 'o', 'n', 'i', 'k', 'a', '-', 's', 'o', 'k', 'o', 'l', '.', 'd', 'e', '\0', @@ -10882,7 +10893,6 @@ static const char kSTSHostTable[] = { /* "my-hps.de", true */ 'm', 'y', '-', 'h', 'p', 's', '.', 'd', 'e', '\0', /* "my-pawnshop.com.ua", false */ 'm', 'y', '-', 'p', 'a', 'w', 'n', 's', 'h', 'o', 'p', '.', 'c', 'o', 'm', '.', 'u', 'a', '\0', /* "my-plancha.ch", true */ 'm', 'y', '-', 'p', 'l', 'a', 'n', 'c', 'h', 'a', '.', 'c', 'h', '\0', - /* "my-voice.nl", true */ 'm', 'y', '-', 'v', 'o', 'i', 'c', 'e', '.', 'n', 'l', '\0', /* "my.onlime.ch", false */ 'm', 'y', '.', 'o', 'n', 'l', 'i', 'm', 'e', '.', 'c', 'h', '\0', /* "my.xero.com", false */ 'm', 'y', '.', 'x', 'e', 'r', 'o', '.', 'c', 'o', 'm', '\0', /* "myaccount.google.com", false */ 'm', 'y', 'a', 'c', 'c', 'o', 'u', 'n', 't', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', @@ -10898,7 +10908,6 @@ static const char kSTSHostTable[] = { /* "mybuilderinlondon.co.uk", true */ 'm', 'y', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 'i', 'n', 'l', 'o', 'n', 'd', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "mybusiness.cm", true */ 'm', 'y', 'b', 'u', 's', 'i', 'n', 'e', 's', 's', '.', 'c', 'm', '\0', /* "mycard.moe", true */ 'm', 'y', 'c', 'a', 'r', 'd', '.', 'm', 'o', 'e', '\0', - /* "mychocolateweightloss.com", true */ 'm', 'y', 'c', 'h', 'o', 'c', 'o', 'l', 'a', 't', 'e', 'w', 'e', 'i', 'g', 'h', 't', 'l', 'o', 's', 's', '.', 'c', 'o', 'm', '\0', /* "mycieokien.info", false */ 'm', 'y', 'c', 'i', 'e', 'o', 'k', 'i', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0', /* "myclientsplus.com", true */ 'm', 'y', 'c', 'l', 'i', 'e', 'n', 't', 's', 'p', 'l', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "mycompanion.cz", true */ 'm', 'y', 'c', 'o', 'm', 'p', 'a', 'n', 'i', 'o', 'n', '.', 'c', 'z', '\0', @@ -10953,6 +10962,7 @@ static const char kSTSHostTable[] = { /* "myownwebinar.com", true */ 'm', 'y', 'o', 'w', 'n', 'w', 'e', 'b', 'i', 'n', 'a', 'r', '.', 'c', 'o', 'm', '\0', /* "mypaperwriter.com", true */ 'm', 'y', 'p', 'a', 'p', 'e', 'r', 'w', 'r', 'i', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "mypayoffloan.com", true */ 'm', 'y', 'p', 'a', 'y', 'o', 'f', 'f', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0', + /* "mypillcard.com", true */ 'm', 'y', 'p', 'i', 'l', 'l', 'c', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', /* "myplaceonline.com", true */ 'm', 'y', 'p', 'l', 'a', 'c', 'e', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0', /* "myprintcard.de", true */ 'm', 'y', 'p', 'r', 'i', 'n', 't', 'c', 'a', 'r', 'd', '.', 'd', 'e', '\0', /* "myptsite.com", true */ 'm', 'y', 'p', 't', 's', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0', @@ -10979,6 +10989,7 @@ static const char kSTSHostTable[] = { /* "mytc.fr", true */ 'm', 'y', 't', 'c', '.', 'f', 'r', '\0', /* "mythengay.ch", true */ 'm', 'y', 't', 'h', 'e', 'n', 'g', 'a', 'y', '.', 'c', 'h', '\0', /* "mythlogic.com", true */ 'm', 'y', 't', 'h', 'l', 'o', 'g', 'i', 'c', '.', 'c', 'o', 'm', '\0', + /* "mythslegendscollection.com", true */ 'm', 'y', 't', 'h', 's', 'l', 'e', 'g', 'e', 'n', 'd', 's', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "mytraiteurs.com", true */ 'm', 'y', 't', 'r', 'a', 'i', 't', 'e', 'u', 'r', 's', '.', 'c', 'o', 'm', '\0', /* "mytripcar.co.uk", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "mytripcar.com", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', 'm', '\0', @@ -11004,7 +11015,6 @@ static const char kSTSHostTable[] = { /* "n0099.cf", false */ 'n', '0', '0', '9', '9', '.', 'c', 'f', '\0', /* "n0paste.tk", false */ 'n', '0', 'p', 'a', 's', 't', 'e', '.', 't', 'k', '\0', /* "n6a.net", true */ 'n', '6', 'a', '.', 'n', 'e', 't', '\0', - /* "n8ch.net", true */ 'n', '8', 'c', 'h', '.', 'n', 'e', 't', '\0', /* "nabankco.com", true */ 'n', 'a', 'b', 'a', 'n', 'k', 'c', 'o', '.', 'c', 'o', 'm', '\0', /* "nabu-bad-nauheim.de", true */ 'n', 'a', 'b', 'u', '-', 'b', 'a', 'd', '-', 'n', 'a', 'u', 'h', 'e', 'i', 'm', '.', 'd', 'e', '\0', /* "nachsendeauftrag.net", true */ 'n', 'a', 'c', 'h', 's', 'e', 'n', 'd', 'e', 'a', 'u', 'f', 't', 'r', 'a', 'g', '.', 'n', 'e', 't', '\0', @@ -11184,7 +11194,6 @@ static const char kSTSHostTable[] = { /* "nerdydev.net", true */ 'n', 'e', 'r', 'd', 'y', 'd', 'e', 'v', '.', 'n', 'e', 't', '\0', /* "neris.io", true */ 'n', 'e', 'r', 'i', 's', '.', 'i', 'o', '\0', /* "nerull7.info", true */ 'n', 'e', 'r', 'u', 'l', 'l', '7', '.', 'i', 'n', 'f', 'o', '\0', - /* "nerven.se", false */ 'n', 'e', 'r', 'v', 'e', 'n', '.', 's', 'e', '\0', /* "nesolabs.de", true */ 'n', 'e', 's', 'o', 'l', 'a', 'b', 's', '.', 'd', 'e', '\0', /* "nestone.ru", true */ 'n', 'e', 's', 't', 'o', 'n', 'e', '.', 'r', 'u', '\0', /* "neswec.org.uk", true */ 'n', 'e', 's', 'w', 'e', 'c', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0', @@ -11744,7 +11753,6 @@ static const char kSTSHostTable[] = { /* "oneononeonone.de", true */ 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', '.', 'd', 'e', '\0', /* "oneononeonone.tv", true */ 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', 'o', 'n', 'o', 'n', 'e', '.', 't', 'v', '\0', /* "onetech.it", true */ 'o', 'n', 'e', 't', 'e', 'c', 'h', '.', 'i', 't', '\0', - /* "oneway.ga", true */ 'o', 'n', 'e', 'w', 'a', 'y', '.', 'g', 'a', '\0', /* "onewaymail.com", true */ 'o', 'n', 'e', 'w', 'a', 'y', 'm', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0', /* "oneweb.hu", true */ 'o', 'n', 'e', 'w', 'e', 'b', '.', 'h', 'u', '\0', /* "onewebdev.info", true */ 'o', 'n', 'e', 'w', 'e', 'b', 'd', 'e', 'v', '.', 'i', 'n', 'f', 'o', '\0', @@ -11778,7 +11786,6 @@ static const char kSTSHostTable[] = { /* "onmarketbookbuilds.com", true */ 'o', 'n', 'm', 'a', 'r', 'k', 'e', 't', 'b', 'o', 'o', 'k', 'b', 'u', 'i', 'l', 'd', 's', '.', 'c', 'o', 'm', '\0', /* "onmuvo.com", true */ 'o', 'n', 'm', 'u', 'v', 'o', '.', 'c', 'o', 'm', '\0', /* "ono.es", true */ 'o', 'n', 'o', '.', 'e', 's', '\0', - /* "onovlena.dn.ua", true */ 'o', 'n', 'o', 'v', 'l', 'e', 'n', 'a', '.', 'd', 'n', '.', 'u', 'a', '\0', /* "onqproductions.com", true */ 'o', 'n', 'q', 'p', 'r', 'o', 'd', 'u', 'c', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0', /* "onrr.gov", true */ 'o', 'n', 'r', 'r', '.', 'g', 'o', 'v', '\0', /* "ons.ca", true */ 'o', 'n', 's', '.', 'c', 'a', '\0', @@ -11811,7 +11818,6 @@ static const char kSTSHostTable[] = { /* "openconnect.com.au", true */ 'o', 'p', 'e', 'n', 'c', 'o', 'n', 'n', 'e', 'c', 't', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "openkim.org", true */ 'o', 'p', 'e', 'n', 'k', 'i', 'm', '.', 'o', 'r', 'g', '\0', /* "openkvk.nl", true */ 'o', 'p', 'e', 'n', 'k', 'v', 'k', '.', 'n', 'l', '\0', - /* "openmtbmap.org", true */ 'o', 'p', 'e', 'n', 'm', 't', 'b', 'm', 'a', 'p', '.', 'o', 'r', 'g', '\0', /* "opennippon.com", true */ 'o', 'p', 'e', 'n', 'n', 'i', 'p', 'p', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "opennippon.ru", true */ 'o', 'p', 'e', 'n', 'n', 'i', 'p', 'p', 'o', 'n', '.', 'r', 'u', '\0', /* "openpictures.ch", true */ 'o', 'p', 'e', 'n', 'p', 'i', 'c', 't', 'u', 'r', 'e', 's', '.', 'c', 'h', '\0', @@ -11994,7 +12000,6 @@ static const char kSTSHostTable[] = { /* "palmer.im", true */ 'p', 'a', 'l', 'm', 'e', 'r', '.', 'i', 'm', '\0', /* "pamaniqu.nl", true */ 'p', 'a', 'm', 'a', 'n', 'i', 'q', 'u', '.', 'n', 'l', '\0', /* "pan.digital", true */ 'p', 'a', 'n', '.', 'd', 'i', 'g', 'i', 't', 'a', 'l', '\0', - /* "panama-gbs.com", true */ 'p', 'a', 'n', 'a', 'm', 'a', '-', 'g', 'b', 's', '.', 'c', 'o', 'm', '\0', /* "panaxis.ch", true */ 'p', 'a', 'n', 'a', 'x', 'i', 's', '.', 'c', 'h', '\0', /* "pandemicflu.gov", true */ 'p', 'a', 'n', 'd', 'e', 'm', 'i', 'c', 'f', 'l', 'u', '.', 'g', 'o', 'v', '\0', /* "pandoraflora.com", true */ 'p', 'a', 'n', 'd', 'o', 'r', 'a', 'f', 'l', 'o', 'r', 'a', '.', 'c', 'o', 'm', '\0', @@ -12135,7 +12140,6 @@ static const char kSTSHostTable[] = { /* "paymentaccuracy.gov", true */ 'p', 'a', 'y', 'm', 'e', 'n', 't', 'a', 'c', 'c', 'u', 'r', 'a', 'c', 'y', '.', 'g', 'o', 'v', '\0', /* "payments-reference.org", true */ 'p', 'a', 'y', 'm', 'e', 'n', 't', 's', '-', 'r', 'e', 'f', 'e', 'r', 'e', 'n', 'c', 'e', '.', 'o', 'r', 'g', '\0', /* "payments.google.com", true */ 'p', 'a', 'y', 'm', 'e', 'n', 't', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', - /* "paymerang.com", true */ 'p', 'a', 'y', 'm', 'e', 'r', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "paymill.com", true */ 'p', 'a', 'y', 'm', 'i', 'l', 'l', '.', 'c', 'o', 'm', '\0', /* "paymill.de", true */ 'p', 'a', 'y', 'm', 'i', 'l', 'l', '.', 'd', 'e', '\0', /* "paymon.tj", true */ 'p', 'a', 'y', 'm', 'o', 'n', '.', 't', 'j', '\0', @@ -12272,6 +12276,7 @@ static const char kSTSHostTable[] = { /* "persson.me", true */ 'p', 'e', 'r', 's', 's', 'o', 'n', '.', 'm', 'e', '\0', /* "perzeidi.hr", true */ 'p', 'e', 'r', 'z', 'e', 'i', 'd', 'i', '.', 'h', 'r', '\0', /* "pesmyclub.com", true */ 'p', 'e', 's', 'm', 'y', 'c', 'l', 'u', 'b', '.', 'c', 'o', 'm', '\0', + /* "pestici.de", true */ 'p', 'e', 's', 't', 'i', 'c', 'i', '.', 'd', 'e', '\0', /* "pet-hotel-mura.net", true */ 'p', 'e', 't', '-', 'h', 'o', 't', 'e', 'l', '-', 'm', 'u', 'r', 'a', '.', 'n', 'e', 't', '\0', /* "petabits.de", true */ 'p', 'e', 't', 'a', 'b', 'i', 't', 's', '.', 'd', 'e', '\0', /* "peter.org.ua", true */ 'p', 'e', 't', 'e', 'r', '.', 'o', 'r', 'g', '.', 'u', 'a', '\0', @@ -12431,7 +12436,6 @@ static const char kSTSHostTable[] = { /* "pimspage.nl", true */ 'p', 'i', 'm', 's', 'p', 'a', 'g', 'e', '.', 'n', 'l', '\0', /* "pin.net.au", true */ 'p', 'i', 'n', '.', 'n', 'e', 't', '.', 'a', 'u', '\0', /* "pincha.com.tw", true */ 'p', 'i', 'n', 'c', 'h', 'a', '.', 'c', 'o', 'm', '.', 't', 'w', '\0', - /* "pincodeit.com", true */ 'p', 'i', 'n', 'c', 'o', 'd', 'e', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "pindanutjes.be", false */ 'p', 'i', 'n', 'd', 'a', 'n', 'u', 't', 'j', 'e', 's', '.', 'b', 'e', '\0', /* "pinesandneedles.com", true */ 'p', 'i', 'n', 'e', 's', 'a', 'n', 'd', 'n', 'e', 'e', 'd', 'l', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "pinkbike.com", true */ 'p', 'i', 'n', 'k', 'b', 'i', 'k', 'e', '.', 'c', 'o', 'm', '\0', @@ -12622,7 +12626,6 @@ static const char kSTSHostTable[] = { /* "port80.hamburg", true */ 'p', 'o', 'r', 't', '8', '0', '.', 'h', 'a', 'm', 'b', 'u', 'r', 'g', '\0', /* "portal.tirol.gv.at", true */ 'p', 'o', 'r', 't', 'a', 'l', '.', 't', 'i', 'r', 'o', 'l', '.', 'g', 'v', '.', 'a', 't', '\0', /* "portaluniversalista.org", true */ 'p', 'o', 'r', 't', 'a', 'l', 'u', 'n', 'i', 'v', 'e', 'r', 's', 'a', 'l', 'i', 's', 't', 'a', '.', 'o', 'r', 'g', '\0', - /* "portalzine.de", true */ 'p', 'o', 'r', 't', 'a', 'l', 'z', 'i', 'n', 'e', '.', 'd', 'e', '\0', /* "portercup.com", true */ 'p', 'o', 'r', 't', 'e', 'r', 'c', 'u', 'p', '.', 'c', 'o', 'm', '\0', /* "portofrotterdam.com", true */ 'p', 'o', 'r', 't', 'o', 'f', 'r', 'o', 't', 't', 'e', 'r', 'd', 'a', 'm', '.', 'c', 'o', 'm', '\0', /* "portosonline.pl", true */ 'p', 'o', 'r', 't', 'o', 's', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'p', 'l', '\0', @@ -12684,6 +12687,7 @@ static const char kSTSHostTable[] = { /* "praguepsychology.cz", true */ 'p', 'r', 'a', 'g', 'u', 'e', 'p', 's', 'y', 'c', 'h', 'o', 'l', 'o', 'g', 'y', '.', 'c', 'z', '\0', /* "prakharprasad.com", true */ 'p', 'r', 'a', 'k', 'h', 'a', 'r', 'p', 'r', 'a', 's', 'a', 'd', '.', 'c', 'o', 'm', '\0', /* "pratinav.xyz", true */ 'p', 'r', 'a', 't', 'i', 'n', 'a', 'v', '.', 'x', 'y', 'z', '\0', + /* "prattpokemon.com", true */ 'p', 'r', 'a', 't', 't', 'p', 'o', 'k', 'e', 'm', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "praxis-research.info", true */ 'p', 'r', 'a', 'x', 'i', 's', '-', 'r', 'e', 's', 'e', 'a', 'r', 'c', 'h', '.', 'i', 'n', 'f', 'o', '\0', /* "prayerrequest.com", true */ 'p', 'r', 'a', 'y', 'e', 'r', 'r', 'e', 'q', 'u', 'e', 's', 't', '.', 'c', 'o', 'm', '\0', /* "prazynka.pl", true */ 'p', 'r', 'a', 'z', 'y', 'n', 'k', 'a', '.', 'p', 'l', '\0', @@ -12758,13 +12762,13 @@ static const char kSTSHostTable[] = { /* "pro-link.eu", true */ 'p', 'r', 'o', '-', 'l', 'i', 'n', 'k', '.', 'e', 'u', '\0', /* "probas.de", true */ 'p', 'r', 'o', 'b', 'a', 's', '.', 'd', 'e', '\0', /* "probiv.biz", true */ 'p', 'r', 'o', 'b', 'i', 'v', '.', 'b', 'i', 'z', '\0', + /* "procens.us", true */ 'p', 'r', 'o', 'c', 'e', 'n', 's', '.', 'u', 's', '\0', /* "procensus.com", true */ 'p', 'r', 'o', 'c', 'e', 'n', 's', 'u', 's', '.', 'c', 'o', 'm', '\0', /* "proclib.org", true */ 'p', 'r', 'o', 'c', 'l', 'i', 'b', '.', 'o', 'r', 'g', '\0', /* "procrastinationland.com", true */ 'p', 'r', 'o', 'c', 'r', 'a', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "prodct.info", true */ 'p', 'r', 'o', 'd', 'c', 't', '.', 'i', 'n', 'f', 'o', '\0', /* "productdesignsoftware.com.au", true */ 'p', 'r', 'o', 'd', 'u', 'c', 't', 'd', 'e', 's', 'i', 'g', 'n', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "productgap.com", true */ 'p', 'r', 'o', 'd', 'u', 'c', 't', 'g', 'a', 'p', '.', 'c', 'o', 'm', '\0', - /* "production.vn", true */ 'p', 'r', 'o', 'd', 'u', 'c', 't', 'i', 'o', 'n', '.', 'v', 'n', '\0', /* "producto8.com", true */ 'p', 'r', 'o', 'd', 'u', 'c', 't', 'o', '8', '.', 'c', 'o', 'm', '\0', /* "proefteksten.nl", true */ 'p', 'r', 'o', 'e', 'f', 't', 'e', 'k', 's', 't', 'e', 'n', '.', 'n', 'l', '\0', /* "profection.biz", true */ 'p', 'r', 'o', 'f', 'e', 'c', 't', 'i', 'o', 'n', '.', 'b', 'i', 'z', '\0', @@ -12797,6 +12801,7 @@ static const char kSTSHostTable[] = { /* "projectte.ch", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 't', 'e', '.', 'c', 'h', '\0', /* "projektik.cz", true */ 'p', 'r', 'o', 'j', 'e', 'k', 't', 'i', 'k', '.', 'c', 'z', '\0', /* "projektzentrisch.de", true */ 'p', 'r', 'o', 'j', 'e', 'k', 't', 'z', 'e', 'n', 't', 'r', 'i', 's', 'c', 'h', '.', 'd', 'e', '\0', + /* "prok.pw", true */ 'p', 'r', 'o', 'k', '.', 'p', 'w', '\0', /* "prokop.ovh", true */ 'p', 'r', 'o', 'k', 'o', 'p', '.', 'o', 'v', 'h', '\0', /* "prolan.pw", true */ 'p', 'r', 'o', 'l', 'a', 'n', '.', 'p', 'w', '\0', /* "prometheanfire.net", true */ 'p', 'r', 'o', 'm', 'e', 't', 'h', 'e', 'a', 'n', 'f', 'i', 'r', 'e', '.', 'n', 'e', 't', '\0', @@ -12989,6 +12994,7 @@ static const char kSTSHostTable[] = { /* "qm-marzahnnordwest.de", true */ 'q', 'm', '-', 'm', 'a', 'r', 'z', 'a', 'h', 'n', 'n', 'o', 'r', 'd', 'w', 'e', 's', 't', '.', 'd', 'e', '\0', /* "qochealth.com", true */ 'q', 'o', 'c', 'h', 'e', 'a', 'l', 't', 'h', '.', 'c', 'o', 'm', '\0', /* "qonqa.de", true */ 'q', 'o', 'n', 'q', 'a', '.', 'd', 'e', '\0', + /* "qop.io", true */ 'q', 'o', 'p', '.', 'i', 'o', '\0', /* "qotw.net", true */ 'q', 'o', 't', 'w', '.', 'n', 'e', 't', '\0', /* "qqj.net", true */ 'q', 'q', 'j', '.', 'n', 'e', 't', '\0', /* "qr-city.org", true */ 'q', 'r', '-', 'c', 'i', 't', 'y', '.', 'o', 'r', 'g', '\0', @@ -13132,7 +13138,6 @@ static const char kSTSHostTable[] = { /* "ratd.net", true */ 'r', 'a', 't', 'd', '.', 'n', 'e', 't', '\0', /* "rationalops.com", true */ 'r', 'a', 't', 'i', 'o', 'n', 'a', 'l', 'o', 'p', 's', '.', 'c', 'o', 'm', '\0', /* "ratuseks.net", false */ 'r', 'a', 't', 'u', 's', 'e', 'k', 's', '.', 'n', 'e', 't', '\0', - /* "ratuseks.us", false */ 'r', 'a', 't', 'u', 's', 'e', 'k', 's', '.', 'u', 's', '\0', /* "rauchenwald.net", true */ 'r', 'a', 'u', 'c', 'h', 'e', 'n', 'w', 'a', 'l', 'd', '.', 'n', 'e', 't', '\0', /* "raulrivero.es", true */ 'r', 'a', 'u', 'l', 'r', 'i', 'v', 'e', 'r', 'o', '.', 'e', 's', '\0', /* "raumzeitlabor.de", true */ 'r', 'a', 'u', 'm', 'z', 'e', 'i', 't', 'l', 'a', 'b', 'o', 'r', '.', 'd', 'e', '\0', @@ -13277,7 +13282,6 @@ static const char kSTSHostTable[] = { /* "rehabthailand.com", true */ 'r', 'e', 'h', 'a', 'b', 't', 'h', 'a', 'i', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0', /* "rehabthailand.nl", true */ 'r', 'e', 'h', 'a', 'b', 't', 'h', 'a', 'i', 'l', 'a', 'n', 'd', '.', 'n', 'l', '\0', /* "reichelt-cloud.de", true */ 'r', 'e', 'i', 'c', 'h', 'e', 'l', 't', '-', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0', - /* "reichl-online.net", true */ 'r', 'e', 'i', 'c', 'h', 'l', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'n', 'e', 't', '\0', /* "reiki-coaching.nl", true */ 'r', 'e', 'i', 'k', 'i', '-', 'c', 'o', 'a', 'c', 'h', 'i', 'n', 'g', '.', 'n', 'l', '\0', /* "reikiqueen.uk", true */ 'r', 'e', 'i', 'k', 'i', 'q', 'u', 'e', 'e', 'n', '.', 'u', 'k', '\0', /* "reilly.io", true */ 'r', 'e', 'i', 'l', 'l', 'y', '.', 'i', 'o', '\0', @@ -13367,7 +13371,6 @@ static const char kSTSHostTable[] = { /* "restaurant-rosengarten.at", true */ 'r', 'e', 's', 't', 'a', 'u', 'r', 'a', 'n', 't', '-', 'r', 'o', 's', 'e', 'n', 'g', 'a', 'r', 't', 'e', 'n', '.', 'a', 't', '\0', /* "restaurantmangal.ch", true */ 'r', 'e', 's', 't', 'a', 'u', 'r', 'a', 'n', 't', 'm', 'a', 'n', 'g', 'a', 'l', '.', 'c', 'h', '\0', /* "restoruns.com", true */ 'r', 'e', 's', 't', 'o', 'r', 'u', 'n', 's', '.', 'c', 'o', 'm', '\0', - /* "restrealitaet.de", true */ 'r', 'e', 's', 't', 'r', 'e', 'a', 'l', 'i', 't', 'a', 'e', 't', '.', 'd', 'e', '\0', /* "restrito.org", true */ 'r', 'e', 's', 't', 'r', 'i', 't', 'o', '.', 'o', 'r', 'g', '\0', /* "retcor.net", true */ 'r', 'e', 't', 'c', 'o', 'r', '.', 'n', 'e', 't', '\0', /* "reth.ch", true */ 'r', 'e', 't', 'h', '.', 'c', 'h', '\0', @@ -13531,6 +13534,7 @@ static const char kSTSHostTable[] = { /* "rockpesado.com.br", true */ 'r', 'o', 'c', 'k', 'p', 'e', 's', 'a', 'd', 'o', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "rockz.io", true */ 'r', 'o', 'c', 'k', 'z', '.', 'i', 'o', '\0', /* "rocssti.net", true */ 'r', 'o', 'c', 's', 's', 't', 'i', '.', 'n', 'e', 't', '\0', + /* "rodehutskors.net", true */ 'r', 'o', 'd', 'e', 'h', 'u', 't', 's', 'k', 'o', 'r', 's', '.', 'n', 'e', 't', '\0', /* "rodevlaggen.nl", true */ 'r', 'o', 'd', 'e', 'v', 'l', 'a', 'g', 'g', 'e', 'n', '.', 'n', 'l', '\0', /* "rodneybrooksjr.com", true */ 'r', 'o', 'd', 'n', 'e', 'y', 'b', 'r', 'o', 'o', 'k', 's', 'j', 'r', '.', 'c', 'o', 'm', '\0', /* "rodolfo.gs", true */ 'r', 'o', 'd', 'o', 'l', 'f', 'o', '.', 'g', 's', '\0', @@ -14021,7 +14025,6 @@ static const char kSTSHostTable[] = { /* "scrap.tf", true */ 's', 'c', 'r', 'a', 'p', '.', 't', 'f', '\0', /* "scrayos.net", true */ 's', 'c', 'r', 'a', 'y', 'o', 's', '.', 'n', 'e', 't', '\0', /* "screenlight.tv", true */ 's', 'c', 'r', 'e', 'e', 'n', 'l', 'i', 'g', 'h', 't', '.', 't', 'v', '\0', - /* "scribbleserver.com", true */ 's', 'c', 'r', 'i', 'b', 'b', 'l', 'e', 's', 'e', 'r', 'v', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "script.google.com", true */ 's', 'c', 'r', 'i', 'p', 't', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0', /* "scriptenforcer.net", true */ 's', 'c', 'r', 'i', 'p', 't', 'e', 'n', 'f', 'o', 'r', 'c', 'e', 'r', '.', 'n', 'e', 't', '\0', /* "scriptjunkie.us", true */ 's', 'c', 'r', 'i', 'p', 't', 'j', 'u', 'n', 'k', 'i', 'e', '.', 'u', 's', '\0', @@ -14073,6 +14076,7 @@ static const char kSTSHostTable[] = { /* "secondarysurvivor.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', '.', 'h', 'e', 'l', 'p', '\0', /* "secondarysurvivorportal.com", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', 'p', 'o', 'r', 't', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "secondarysurvivorportal.help", true */ 's', 'e', 'c', 'o', 'n', 'd', 'a', 'r', 'y', 's', 'u', 'r', 'v', 'i', 'v', 'o', 'r', 'p', 'o', 'r', 't', 'a', 'l', '.', 'h', 'e', 'l', 'p', '\0', + /* "secondpay.nl", true */ 's', 'e', 'c', 'o', 'n', 'd', 'p', 'a', 'y', '.', 'n', 'l', '\0', /* "secondspace.ca", true */ 's', 'e', 'c', 'o', 'n', 'd', 's', 'p', 'a', 'c', 'e', '.', 'c', 'a', '\0', /* "seconfig.sytes.net", true */ 's', 'e', 'c', 'o', 'n', 'f', 'i', 'g', '.', 's', 'y', 't', 'e', 's', '.', 'n', 'e', 't', '\0', /* "secpatrol.de", true */ 's', 'e', 'c', 'p', 'a', 't', 'r', 'o', 'l', '.', 'd', 'e', '\0', @@ -14114,6 +14118,7 @@ static const char kSTSHostTable[] = { /* "securitybrief.co.nz", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'b', 'r', 'i', 'e', 'f', '.', 'c', 'o', '.', 'n', 'z', '\0', /* "securitybrief.com.au", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'b', 'r', 'i', 'e', 'f', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "securityheaders.io", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'h', 'e', 'a', 'd', 'e', 'r', 's', '.', 'i', 'o', '\0', + /* "securitymap.wiki", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'm', 'a', 'p', '.', 'w', 'i', 'k', 'i', '\0', /* "securityprimes.in", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 'p', 'r', 'i', 'm', 'e', 's', '.', 'i', 'n', '\0', /* "securitysnobs.com", false */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'n', 'o', 'b', 's', '.', 'c', 'o', 'm', '\0', /* "securitysoapbox.com", true */ 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', 's', 'o', 'a', 'p', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', @@ -14247,6 +14252,7 @@ static const char kSTSHostTable[] = { /* "serviettenhaus.de", true */ 's', 'e', 'r', 'v', 'i', 'e', 't', 't', 'e', 'n', 'h', 'a', 'u', 's', '.', 'd', 'e', '\0', /* "servious.org", true */ 's', 'e', 'r', 'v', 'i', 'o', 'u', 's', '.', 'o', 'r', 'g', '\0', /* "seryovpn.com", true */ 's', 'e', 'r', 'y', 'o', 'v', 'p', 'n', '.', 'c', 'o', 'm', '\0', + /* "sesha.co.za", true */ 's', 'e', 's', 'h', 'a', '.', 'c', 'o', '.', 'z', 'a', '\0', /* "sessionslogning.dk", true */ 's', 'e', 's', 's', 'i', 'o', 'n', 's', 'l', 'o', 'g', 'n', 'i', 'n', 'g', '.', 'd', 'k', '\0', /* "sesslerimmo.ch", true */ 's', 'e', 's', 's', 'l', 'e', 'r', 'i', 'm', 'm', 'o', '.', 'c', 'h', '\0', /* "setfix.de", true */ 's', 'e', 't', 'f', 'i', 'x', '.', 'd', 'e', '\0', @@ -14305,6 +14311,7 @@ static const char kSTSHostTable[] = { /* "shansing.com", true */ 's', 'h', 'a', 'n', 's', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "shansing.net", true */ 's', 'h', 'a', 'n', 's', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0', /* "shansing.space", true */ 's', 'h', 'a', 'n', 's', 'i', 'n', 'g', '.', 's', 'p', 'a', 'c', 'e', '\0', + /* "shaobin.wang", true */ 's', 'h', 'a', 'o', 'b', 'i', 'n', '.', 'w', 'a', 'n', 'g', '\0', /* "shapesedinburgh.co.uk", true */ 's', 'h', 'a', 'p', 'e', 's', 'e', 'd', 'i', 'n', 'b', 'u', 'r', 'g', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "shardsoft.com", true */ 's', 'h', 'a', 'r', 'd', 's', 'o', 'f', 't', '.', 'c', 'o', 'm', '\0', /* "shareeri.com", true */ 's', 'h', 'a', 'r', 'e', 'e', 'r', 'i', '.', 'c', 'o', 'm', '\0', @@ -14388,7 +14395,6 @@ static const char kSTSHostTable[] = { /* "shortdiary.me", true */ 's', 'h', 'o', 'r', 't', 'd', 'i', 'a', 'r', 'y', '.', 'm', 'e', '\0', /* "shorten.ninja", true */ 's', 'h', 'o', 'r', 't', 'e', 'n', '.', 'n', 'i', 'n', 'j', 'a', '\0', /* "shortpath.com", true */ 's', 'h', 'o', 'r', 't', 'p', 'a', 't', 'h', '.', 'c', 'o', 'm', '\0', - /* "shota.party", true */ 's', 'h', 'o', 't', 'a', '.', 'p', 'a', 'r', 't', 'y', '\0', /* "shotbow.net", true */ 's', 'h', 'o', 't', 'b', 'o', 'w', '.', 'n', 'e', 't', '\0', /* "show-saratov.ru", true */ 's', 'h', 'o', 'w', '-', 's', 'a', 'r', 'a', 't', 'o', 'v', '.', 'r', 'u', '\0', /* "shower.im", true */ 's', 'h', 'o', 'w', 'e', 'r', '.', 'i', 'm', '\0', @@ -14743,6 +14749,7 @@ static const char kSTSHostTable[] = { /* "so-healthy.co.uk", true */ 's', 'o', '-', 'h', 'e', 'a', 'l', 't', 'h', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "sobaya-gohei.com", true */ 's', 'o', 'b', 'a', 'y', 'a', '-', 'g', 'o', 'h', 'e', 'i', '.', 'c', 'o', 'm', '\0', /* "sobieray.dyndns.org", true */ 's', 'o', 'b', 'i', 'e', 'r', 'a', 'y', '.', 'd', 'y', 'n', 'd', 'n', 's', '.', 'o', 'r', 'g', '\0', + /* "sobinski.pl", false */ 's', 'o', 'b', 'i', 'n', 's', 'k', 'i', '.', 'p', 'l', '\0', /* "soccersavings.com", true */ 's', 'o', 'c', 'c', 'e', 'r', 's', 'a', 'v', 'i', 'n', 'g', 's', '.', 'c', 'o', 'm', '\0', /* "sochi-sochno.ru", true */ 's', 'o', 'c', 'h', 'i', '-', 's', 'o', 'c', 'h', 'n', 'o', '.', 'r', 'u', '\0', /* "social-events.net", false */ 's', 'o', 'c', 'i', 'a', 'l', '-', 'e', 'v', 'e', 'n', 't', 's', '.', 'n', 'e', 't', '\0', @@ -14941,6 +14948,7 @@ static const char kSTSHostTable[] = { /* "spitefultowel.com", true */ 's', 'p', 'i', 't', 'e', 'f', 'u', 'l', 't', 'o', 'w', 'e', 'l', '.', 'c', 'o', 'm', '\0', /* "spitfireuav.com", true */ 's', 'p', 'i', 't', 'f', 'i', 'r', 'e', 'u', 'a', 'v', '.', 'c', 'o', 'm', '\0', /* "splikity.com", true */ 's', 'p', 'l', 'i', 'k', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', + /* "split.is", true */ 's', 'p', 'l', 'i', 't', '.', 'i', 's', '\0', /* "splitdna.com", true */ 's', 'p', 'l', 'i', 't', 'd', 'n', 'a', '.', 'c', 'o', 'm', '\0', /* "splitreflection.com", true */ 's', 'p', 'l', 'i', 't', 'r', 'e', 'f', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "splunk.net", true */ 's', 'p', 'l', 'u', 'n', 'k', '.', 'n', 'e', 't', '\0', @@ -14991,6 +14999,7 @@ static const char kSTSHostTable[] = { /* "sqlapius.net", true */ 's', 'q', 'l', 'a', 'p', 'i', 'u', 's', '.', 'n', 'e', 't', '\0', /* "sqr-training.com", true */ 's', 'q', 'r', '-', 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "sqshq.de", true */ 's', 'q', 's', 'h', 'q', '.', 'd', 'e', '\0', + /* "squaddraft.com", true */ 's', 'q', 'u', 'a', 'd', 'd', 'r', 'a', 'f', 't', '.', 'c', 'o', 'm', '\0', /* "square-gaming.org", true */ 's', 'q', 'u', 'a', 'r', 'e', '-', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0', /* "square-src.de", true */ 's', 'q', 'u', 'a', 'r', 'e', '-', 's', 'r', 'c', '.', 'd', 'e', '\0', /* "square.com", false */ 's', 'q', 'u', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', @@ -15129,6 +15138,7 @@ static const char kSTSHostTable[] = { /* "steelephys.com.au", true */ 's', 't', 'e', 'e', 'l', 'e', 'p', 'h', 'y', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "steemit.com", true */ 's', 't', 'e', 'e', 'm', 'i', 't', '.', 'c', 'o', 'm', '\0', /* "steenackers.be", true */ 's', 't', 'e', 'e', 'n', 'a', 'c', 'k', 'e', 'r', 's', '.', 'b', 'e', '\0', + /* "stefanovski.io", true */ 's', 't', 'e', 'f', 'a', 'n', 'o', 'v', 's', 'k', 'i', '.', 'i', 'o', '\0', /* "stefany.eu", true */ 's', 't', 'e', 'f', 'a', 'n', 'y', '.', 'e', 'u', '\0', /* "steidlewirt.de", true */ 's', 't', 'e', 'i', 'd', 'l', 'e', 'w', 'i', 'r', 't', '.', 'd', 'e', '\0', /* "steigerplank.com", false */ 's', 't', 'e', 'i', 'g', 'e', 'r', 'p', 'l', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0', @@ -15184,7 +15194,6 @@ static const char kSTSHostTable[] = { /* "stmsolutions.pl", true */ 's', 't', 'm', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'p', 'l', '\0', /* "stnl.de", false */ 's', 't', 'n', 'l', '.', 'd', 'e', '\0', /* "stockrow.com", true */ 's', 't', 'o', 'c', 'k', 'r', 'o', 'w', '.', 'c', 'o', 'm', '\0', - /* "stockseyeserum.com", true */ 's', 't', 'o', 'c', 'k', 's', 'e', 'y', 'e', 's', 'e', 'r', 'u', 'm', '.', 'c', 'o', 'm', '\0', /* "stocktrader.com", true */ 's', 't', 'o', 'c', 'k', 't', 'r', 'a', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "stoffelen.nl", true */ 's', 't', 'o', 'f', 'f', 'e', 'l', 'e', 'n', '.', 'n', 'l', '\0', /* "stoianlawfirm.com", true */ 's', 't', 'o', 'i', 'a', 'n', 'l', 'a', 'w', 'f', 'i', 'r', 'm', '.', 'c', 'o', 'm', '\0', @@ -15313,8 +15322,8 @@ static const char kSTSHostTable[] = { /* "sunbritetv.com", true */ 's', 'u', 'n', 'b', 'r', 'i', 't', 'e', 't', 'v', '.', 'c', 'o', 'm', '\0', /* "sundayfundayjapan.com", true */ 's', 'u', 'n', 'd', 'a', 'y', 'f', 'u', 'n', 'd', 'a', 'y', 'j', 'a', 'p', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "suneilpatel.com", true */ 's', 'u', 'n', 'e', 'i', 'l', 'p', 'a', 't', 'e', 'l', '.', 'c', 'o', 'm', '\0', - /* "sunflyer.cn", false */ 's', 'u', 'n', 'f', 'l', 'y', 'e', 'r', '.', 'c', 'n', '\0', /* "sunfox.cz", true */ 's', 'u', 'n', 'f', 'o', 'x', '.', 'c', 'z', '\0', + /* "sunfulong.me", true */ 's', 'u', 'n', 'f', 'u', 'l', 'o', 'n', 'g', '.', 'm', 'e', '\0', /* "sunjaydhama.com", true */ 's', 'u', 'n', 'j', 'a', 'y', 'd', 'h', 'a', 'm', 'a', '.', 'c', 'o', 'm', '\0', /* "sunsetwx.com", true */ 's', 'u', 'n', 's', 'e', 't', 'w', 'x', '.', 'c', 'o', 'm', '\0', /* "sunstar.bg", true */ 's', 'u', 'n', 's', 't', 'a', 'r', '.', 'b', 'g', '\0', @@ -15664,7 +15673,6 @@ static const char kSTSHostTable[] = { /* "techtraveller.com.au", true */ 't', 'e', 'c', 'h', 't', 'r', 'a', 'v', 'e', 'l', 'l', 'e', 'r', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "techvalue.gr", true */ 't', 'e', 'c', 'h', 'v', 'a', 'l', 'u', 'e', '.', 'g', 'r', '\0', /* "techwords.io", true */ 't', 'e', 'c', 'h', 'w', 'o', 'r', 'd', 's', '.', 'i', 'o', '\0', - /* "tecnimotos.com", true */ 't', 'e', 'c', 'n', 'i', 'm', 'o', 't', 'o', 's', '.', 'c', 'o', 'm', '\0', /* "tecnoarea.com.ar", true */ 't', 'e', 'c', 'n', 'o', 'a', 'r', 'e', 'a', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0', /* "tecnodritte.it", true */ 't', 'e', 'c', 'n', 'o', 'd', 'r', 'i', 't', 't', 'e', '.', 'i', 't', '\0', /* "tecnogaming.com", true */ 't', 'e', 'c', 'n', 'o', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0', @@ -15746,7 +15754,6 @@ static const char kSTSHostTable[] = { /* "testbirds.sk", true */ 't', 'e', 's', 't', 'b', 'i', 'r', 'd', 's', '.', 's', 'k', '\0', /* "testingbot.com", false */ 't', 'e', 's', 't', 'i', 'n', 'g', 'b', 'o', 't', '.', 'c', 'o', 'm', '\0', /* "testomato.com", true */ 't', 'e', 's', 't', 'o', 'm', 'a', 't', 'o', '.', 'c', 'o', 'm', '\0', - /* "testosterone-complex.com", true */ 't', 'e', 's', 't', 'o', 's', 't', 'e', 'r', 'o', 'n', 'e', '-', 'c', 'o', 'm', 'p', 'l', 'e', 'x', '.', 'c', 'o', 'm', '\0', /* "testsuite.org", true */ 't', 'e', 's', 't', 's', 'u', 'i', 't', 'e', '.', 'o', 'r', 'g', '\0', /* "testuje.net", true */ 't', 'e', 's', 't', 'u', 'j', 'e', '.', 'n', 'e', 't', '\0', /* "tetramax.eu", true */ 't', 'e', 't', 'r', 'a', 'm', 'a', 'x', '.', 'e', 'u', '\0', @@ -15945,7 +15952,6 @@ static const char kSTSHostTable[] = { /* "thinlyveiledcontempt.com", true */ 't', 'h', 'i', 'n', 'l', 'y', 'v', 'e', 'i', 'l', 'e', 'd', 'c', 'o', 'n', 't', 'e', 'm', 'p', 't', '.', 'c', 'o', 'm', '\0', /* "thisbrownman.com", true */ 't', 'h', 'i', 's', 'b', 'r', 'o', 'w', 'n', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0', /* "thisfreelife.gov", true */ 't', 'h', 'i', 's', 'f', 'r', 'e', 'e', 'l', 'i', 'f', 'e', '.', 'g', 'o', 'v', '\0', - /* "thisishugo.com", false */ 't', 'h', 'i', 's', 'i', 's', 'h', 'u', 'g', 'o', '.', 'c', 'o', 'm', '\0', /* "thisserver.dontexist.net", true */ 't', 'h', 'i', 's', 's', 'e', 'r', 'v', 'e', 'r', '.', 'd', 'o', 'n', 't', 'e', 'x', 'i', 's', 't', '.', 'n', 'e', 't', '\0', /* "thistleandleaves.com", true */ 't', 'h', 'i', 's', 't', 'l', 'e', 'a', 'n', 'd', 'l', 'e', 'a', 'v', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "thkb.net", true */ 't', 'h', 'k', 'b', '.', 'n', 'e', 't', '\0', @@ -16142,7 +16148,6 @@ static const char kSTSHostTable[] = { /* "tokotamz.net", true */ 't', 'o', 'k', 'o', 't', 'a', 'm', 'z', '.', 'n', 'e', 't', '\0', /* "tokotimbangandigitalmurah.web.id", false */ 't', 'o', 'k', 'o', 't', 'i', 'm', 'b', 'a', 'n', 'g', 'a', 'n', 'd', 'i', 'g', 'i', 't', 'a', 'l', 'm', 'u', 'r', 'a', 'h', '.', 'w', 'e', 'b', '.', 'i', 'd', '\0', /* "tokototech.com", true */ 't', 'o', 'k', 'o', 't', 'o', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0', - /* "tokoyo.biz", true */ 't', 'o', 'k', 'o', 'y', 'o', '.', 'b', 'i', 'z', '\0', /* "tokyo-powerstation.com", true */ 't', 'o', 'k', 'y', 'o', '-', 'p', 'o', 'w', 'e', 'r', 's', 't', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0', /* "tokyo.dating", true */ 't', 'o', 'k', 'y', 'o', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0', /* "tolboe.com", true */ 't', 'o', 'l', 'b', 'o', 'e', '.', 'c', 'o', 'm', '\0', @@ -16327,6 +16332,7 @@ static const char kSTSHostTable[] = { /* "tragmi.ch", true */ 't', 'r', 'a', 'g', 'm', 'i', '.', 'c', 'h', '\0', /* "trailforks.com", true */ 't', 'r', 'a', 'i', 'l', 'f', 'o', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0', /* "trainex.org", true */ 't', 'r', 'a', 'i', 'n', 'e', 'x', '.', 'o', 'r', 'g', '\0', + /* "trainhornforums.com", true */ 't', 'r', 'a', 'i', 'n', 'h', 'o', 'r', 'n', 'f', 'o', 'r', 'u', 'm', 's', '.', 'c', 'o', 'm', '\0', /* "training4girls.ru", true */ 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', '4', 'g', 'i', 'r', 'l', 's', '.', 'r', 'u', '\0', /* "traininglist.org", true */ 't', 'r', 'a', 'i', 'n', 'i', 'n', 'g', 'l', 'i', 's', 't', '.', 'o', 'r', 'g', '\0', /* "trainline.de", true */ 't', 'r', 'a', 'i', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0', @@ -16375,6 +16381,7 @@ static const char kSTSHostTable[] = { /* "travisforte.io", true */ 't', 'r', 'a', 'v', 'i', 's', 'f', 'o', 'r', 't', 'e', '.', 'i', 'o', '\0', /* "travisfranck.com", true */ 't', 'r', 'a', 'v', 'i', 's', 'f', 'r', 'a', 'n', 'c', 'k', '.', 'c', 'o', 'm', '\0', /* "travler.net", true */ 't', 'r', 'a', 'v', 'l', 'e', 'r', '.', 'n', 'e', 't', '\0', + /* "treasuredinheritanceministry.com", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'e', 'd', 'i', 'n', 'h', 'e', 'r', 'i', 't', 'a', 'n', 'c', 'e', 'm', 'i', 'n', 'i', 's', 't', 'r', 'y', '.', 'c', 'o', 'm', '\0', /* "treasurydirect.gov", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'y', 'd', 'i', 'r', 'e', 'c', 't', '.', 'g', 'o', 'v', '\0', /* "treasuryhunt.gov", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'y', 'h', 'u', 'n', 't', '.', 'g', 'o', 'v', '\0', /* "treasuryscams.gov", true */ 't', 'r', 'e', 'a', 's', 'u', 'r', 'y', 's', 'c', 'a', 'm', 's', '.', 'g', 'o', 'v', '\0', @@ -16401,6 +16408,7 @@ static const char kSTSHostTable[] = { /* "tributh.net", true */ 't', 'r', 'i', 'b', 'u', 't', 'h', '.', 'n', 'e', 't', '\0', /* "triddi.com", true */ 't', 'r', 'i', 'd', 'd', 'i', '.', 'c', 'o', 'm', '\0', /* "trident-online.de", true */ 't', 'r', 'i', 'd', 'e', 'n', 't', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'd', 'e', '\0', + /* "trik.es", false */ 't', 'r', 'i', 'k', '.', 'e', 's', '\0', /* "trim-a-slab.com", true */ 't', 'r', 'i', 'm', '-', 'a', '-', 's', 'l', 'a', 'b', '.', 'c', 'o', 'm', '\0', /* "trimage.org", true */ 't', 'r', 'i', 'm', 'a', 'g', 'e', '.', 'o', 'r', 'g', '\0', /* "trinary.ca", true */ 't', 'r', 'i', 'n', 'a', 'r', 'y', '.', 'c', 'a', '\0', @@ -16575,14 +16583,12 @@ static const char kSTSHostTable[] = { /* "ub3rk1tten.com", false */ 'u', 'b', '3', 'r', 'k', '1', 't', 't', 'e', 'n', '.', 'c', 'o', 'm', '\0', /* "ubalert.com", true */ 'u', 'b', 'a', 'l', 'e', 'r', 't', '.', 'c', 'o', 'm', '\0', /* "ubanquity.com", true */ 'u', 'b', 'a', 'n', 'q', 'u', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0', - /* "uber.com.au", true */ 'u', 'b', 'e', 'r', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0', /* "uberboxen.net", true */ 'u', 'b', 'e', 'r', 'b', 'o', 'x', 'e', 'n', '.', 'n', 'e', 't', '\0', /* "ubertt.org", true */ 'u', 'b', 'e', 'r', 't', 't', '.', 'o', 'r', 'g', '\0', /* "uberwald.de", true */ 'u', 'b', 'e', 'r', 'w', 'a', 'l', 'd', '.', 'd', 'e', '\0', /* "uberwald.ws", true */ 'u', 'b', 'e', 'r', 'w', 'a', 'l', 'd', '.', 'w', 's', '\0', /* "ubi.gg", true */ 'u', 'b', 'i', '.', 'g', 'g', '\0', /* "ublaboo.org", true */ 'u', 'b', 'l', 'a', 'b', 'o', 'o', '.', 'o', 'r', 'g', '\0', - /* "uborcare.com", true */ 'u', 'b', 'o', 'r', 'c', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "ubtce.com", true */ 'u', 'b', 't', 'c', 'e', '.', 'c', 'o', 'm', '\0', /* "ucfirst.nl", true */ 'u', 'c', 'f', 'i', 'r', 's', 't', '.', 'n', 'l', '\0', /* "ucrdatatool.gov", true */ 'u', 'c', 'r', 'd', 'a', 't', 'a', 't', 'o', 'o', 'l', '.', 'g', 'o', 'v', '\0', @@ -16591,6 +16597,7 @@ static const char kSTSHostTable[] = { /* "udo-luetkemeier.de", true */ 'u', 'd', 'o', '-', 'l', 'u', 'e', 't', 'k', 'e', 'm', 'e', 'i', 'e', 'r', '.', 'd', 'e', '\0', /* "udomain.net", true */ 'u', 'd', 'o', 'm', 'a', 'i', 'n', '.', 'n', 'e', 't', '\0', /* "udp.sh", true */ 'u', 'd', 'p', '.', 's', 'h', '\0', + /* "udruga-point.hr", true */ 'u', 'd', 'r', 'u', 'g', 'a', '-', 'p', 'o', 'i', 'n', 't', '.', 'h', 'r', '\0', /* "ueberwachungspaket.at", true */ 'u', 'e', 'b', 'e', 'r', 'w', 'a', 'c', 'h', 'u', 'n', 'g', 's', 'p', 'a', 'k', 'e', 't', '.', 'a', 't', '\0', /* "uefeng.com", true */ 'u', 'e', 'f', 'e', 'n', 'g', '.', 'c', 'o', 'm', '\0', /* "uerdingen.info", true */ 'u', 'e', 'r', 'd', 'i', 'n', 'g', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0', @@ -16791,7 +16798,6 @@ static const char kSTSHostTable[] = { /* "utilitarianism.org", true */ 'u', 't', 'i', 'l', 'i', 't', 'a', 'r', 'i', 'a', 'n', 'i', 's', 'm', '.', 'o', 'r', 'g', '\0', /* "utilityapi.com", true */ 'u', 't', 'i', 'l', 'i', 't', 'y', 'a', 'p', 'i', '.', 'c', 'o', 'm', '\0', /* "utonia.ch", true */ 'u', 't', 'o', 'n', 'i', 'a', '.', 'c', 'h', '\0', - /* "utopianconcept.com", true */ 'u', 't', 'o', 'p', 'i', 'a', 'n', 'c', 'o', 'n', 'c', 'e', 'p', 't', '.', 'c', 'o', 'm', '\0', /* "utopianrealms.org", true */ 'u', 't', 'o', 'p', 'i', 'a', 'n', 'r', 'e', 'a', 'l', 'm', 's', '.', 'o', 'r', 'g', '\0', /* "utopians.dk", true */ 'u', 't', 'o', 'p', 'i', 'a', 'n', 's', '.', 'd', 'k', '\0', /* "utopicestudios.com", true */ 'u', 't', 'o', 'p', 'i', 'c', 'e', 's', 't', 'u', 'd', 'i', 'o', 's', '.', 'c', 'o', 'm', '\0', @@ -17056,6 +17062,7 @@ static const char kSTSHostTable[] = { /* "vivamusic.es", true */ 'v', 'i', 'v', 'a', 'm', 'u', 's', 'i', 'c', '.', 'e', 's', '\0', /* "vivatv.com.tw", true */ 'v', 'i', 'v', 'a', 't', 'v', '.', 'c', 'o', 'm', '.', 't', 'w', '\0', /* "vivendi.de", true */ 'v', 'i', 'v', 'e', 'n', 'd', 'i', '.', 'd', 'e', '\0', + /* "vivocloud.com", true */ 'v', 'i', 'v', 'o', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0', /* "vizeat.com", true */ 'v', 'i', 'z', 'e', 'a', 't', '.', 'c', 'o', 'm', '\0', /* "vizional.com", true */ 'v', 'i', 'z', 'i', 'o', 'n', 'a', 'l', '.', 'c', 'o', 'm', '\0', /* "vizzboard.com", true */ 'v', 'i', 'z', 'z', 'b', 'o', 'a', 'r', 'd', '.', 'c', 'o', 'm', '\0', @@ -17104,7 +17111,6 @@ static const char kSTSHostTable[] = { /* "voodoo-laden.de", true */ 'v', 'o', 'o', 'd', 'o', 'o', '-', 'l', 'a', 'd', 'e', 'n', '.', 'd', 'e', '\0', /* "voodoochile.at", true */ 'v', 'o', 'o', 'd', 'o', 'o', 'c', 'h', 'i', 'l', 'e', '.', 'a', 't', '\0', /* "voodooladen.de", true */ 'v', 'o', 'o', 'd', 'o', 'o', 'l', 'a', 'd', 'e', 'n', '.', 'd', 'e', '\0', - /* "vooreenveiligthuis.nl", true */ 'v', 'o', 'o', 'r', 'e', 'e', 'n', 'v', 'e', 'i', 'l', 'i', 'g', 't', 'h', 'u', 'i', 's', '.', 'n', 'l', '\0', /* "voorjou.com", true */ 'v', 'o', 'o', 'r', 'j', 'o', 'u', '.', 'c', 'o', 'm', '\0', /* "vop.li", true */ 'v', 'o', 'p', '.', 'l', 'i', '\0', /* "vorangerie.com", true */ 'v', 'o', 'r', 'a', 'n', 'g', 'e', 'r', 'i', 'e', '.', 'c', 'o', 'm', '\0', @@ -17244,6 +17250,7 @@ static const char kSTSHostTable[] = { /* "wawak.pl", true */ 'w', 'a', 'w', 'a', 'k', '.', 'p', 'l', '\0', /* "waxdramatic.com", true */ 'w', 'a', 'x', 'd', 'r', 'a', 'm', 'a', 't', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "waylaydesign.com", true */ 'w', 'a', 'y', 'l', 'a', 'y', 'd', 'e', 's', 'i', 'g', 'n', '.', 'c', 'o', 'm', '\0', + /* "wayne.cloud", false */ 'w', 'a', 'y', 'n', 'e', '.', 'c', 'l', 'o', 'u', 'd', '\0', /* "wayohoo.com", true */ 'w', 'a', 'y', 'o', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0', /* "wayohoo.net", true */ 'w', 'a', 'y', 'o', 'h', 'o', 'o', '.', 'n', 'e', 't', '\0', /* "waze.com", true */ 'w', 'a', 'z', 'e', '.', 'c', 'o', 'm', '\0', @@ -17452,7 +17459,6 @@ static const char kSTSHostTable[] = { /* "whey-protein.ch", true */ 'w', 'h', 'e', 'y', '-', 'p', 'r', 'o', 't', 'e', 'i', 'n', '.', 'c', 'h', '\0', /* "whing.org", true */ 'w', 'h', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0', /* "whipnic.com", true */ 'w', 'h', 'i', 'p', 'n', 'i', 'c', '.', 'c', 'o', 'm', '\0', - /* "whisker.network", true */ 'w', 'h', 'i', 's', 'k', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '\0', /* "whisky-circle.info", true */ 'w', 'h', 'i', 's', 'k', 'y', '-', 'c', 'i', 'r', 'c', 'l', 'e', '.', 'i', 'n', 'f', 'o', '\0', /* "whiskynerd.ca", true */ 'w', 'h', 'i', 's', 'k', 'y', 'n', 'e', 'r', 'd', '.', 'c', 'a', '\0', /* "whisp.ly", false */ 'w', 'h', 'i', 's', 'p', '.', 'l', 'y', '\0', @@ -17541,7 +17547,6 @@ static const char kSTSHostTable[] = { /* "wimbo.nl", true */ 'w', 'i', 'm', 'b', 'o', '.', 'n', 'l', '\0', /* "winbuzzer.com", true */ 'w', 'i', 'n', 'b', 'u', 'z', 'z', 'e', 'r', '.', 'c', 'o', 'm', '\0', /* "wind.moe", true */ 'w', 'i', 'n', 'd', '.', 'm', 'o', 'e', '\0', - /* "windhaven.nl", true */ 'w', 'i', 'n', 'd', 'h', 'a', 'v', 'e', 'n', '.', 'n', 'l', '\0', /* "windholz.us", true */ 'w', 'i', 'n', 'd', 'h', 'o', 'l', 'z', '.', 'u', 's', '\0', /* "windowsphoneblog.it", true */ 'w', 'i', 'n', 'd', 'o', 'w', 's', 'p', 'h', 'o', 'n', 'e', 'b', 'l', 'o', 'g', '.', 'i', 't', '\0', /* "windrunner.se", true */ 'w', 'i', 'n', 'd', 'r', 'u', 'n', 'n', 'e', 'r', '.', 's', 'e', '\0', @@ -17809,7 +17814,6 @@ static const char kSTSHostTable[] = { /* "wzyboy.org", true */ 'w', 'z', 'y', 'b', 'o', 'y', '.', 'o', 'r', 'g', '\0', /* "x-iweb.ru", true */ 'x', '-', 'i', 'w', 'e', 'b', '.', 'r', 'u', '\0', /* "x-pertservice.com", true */ 'x', '-', 'p', 'e', 'r', 't', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0', - /* "x-ripped-hd.com", true */ 'x', '-', 'r', 'i', 'p', 'p', 'e', 'd', '-', 'h', 'd', '.', 'c', 'o', 'm', '\0', /* "x.io", true */ 'x', '.', 'i', 'o', '\0', /* "x.st", true */ 'x', '.', 's', 't', '\0', /* "x378.ch", true */ 'x', '3', '7', '8', '.', 'c', 'h', '\0', @@ -17938,7 +17942,6 @@ static const char kSTSHostTable[] = { /* "xninja.xyz", true */ 'x', 'n', 'i', 'n', 'j', 'a', '.', 'x', 'y', 'z', '\0', /* "xo.tc", true */ 'x', 'o', '.', 't', 'c', '\0', /* "xolphin.nl", true */ 'x', 'o', 'l', 'p', 'h', 'i', 'n', '.', 'n', 'l', '\0', - /* "xom.party", true */ 'x', 'o', 'm', '.', 'p', 'a', 'r', 't', 'y', '\0', /* "xombitgames.com", true */ 'x', 'o', 'm', 'b', 'i', 't', 'g', 'a', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0', /* "xombitmusic.com", true */ 'x', 'o', 'm', 'b', 'i', 't', 'm', 'u', 's', 'i', 'c', '.', 'c', 'o', 'm', '\0', /* "xor-a.net", true */ 'x', 'o', 'r', '-', 'a', '.', 'n', 'e', 't', '\0', @@ -17952,7 +17955,6 @@ static const char kSTSHostTable[] = { /* "xplore-dna.net", true */ 'x', 'p', 'l', 'o', 'r', 'e', '-', 'd', 'n', 'a', '.', 'n', 'e', 't', '\0', /* "xps2pdf.co.uk", true */ 'x', 'p', 's', '2', 'p', 'd', 'f', '.', 'c', 'o', '.', 'u', 'k', '\0', /* "xqin.net", true */ 'x', 'q', 'i', 'n', '.', 'n', 'e', 't', '\0', - /* "xrippedhd.com", true */ 'x', 'r', 'i', 'p', 'p', 'e', 'd', 'h', 'd', '.', 'c', 'o', 'm', '\0', /* "xrockx.de", true */ 'x', 'r', 'o', 'c', 'k', 'x', '.', 'd', 'e', '\0', /* "xroot.org", true */ 'x', 'r', 'o', 'o', 't', '.', 'o', 'r', 'g', '\0', /* "xscancun.com", true */ 'x', 's', 'c', 'a', 'n', 'c', 'u', 'n', '.', 'c', 'o', 'm', '\0', @@ -17990,7 +17992,6 @@ static const char kSTSHostTable[] = { /* "yak.is", true */ 'y', 'a', 'k', '.', 'i', 's', '\0', /* "yakmade.com", true */ 'y', 'a', 'k', 'm', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0', /* "yakmoo.se", true */ 'y', 'a', 'k', 'm', 'o', 'o', '.', 's', 'e', '\0', - /* "yal.sh", true */ 'y', 'a', 'l', '.', 's', 'h', '\0', /* "yama.su", true */ 'y', 'a', 'm', 'a', '.', 's', 'u', '\0', /* "yamadaya.tv", true */ 'y', 'a', 'm', 'a', 'd', 'a', 'y', 'a', '.', 't', 'v', '\0', /* "yamaken.jp", false */ 'y', 'a', 'm', 'a', 'k', 'e', 'n', '.', 'j', 'p', '\0', @@ -18011,7 +18012,6 @@ static const char kSTSHostTable[] = { /* "yawen.tw", true */ 'y', 'a', 'w', 'e', 'n', '.', 't', 'w', '\0', /* "yawnbox.com", true */ 'y', 'a', 'w', 'n', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0', /* "yaxim.org", true */ 'y', 'a', 'x', 'i', 'm', '.', 'o', 'r', 'g', '\0', - /* "ycc.wtf", false */ 'y', 'c', 'c', '.', 'w', 't', 'f', '\0', /* "yclan.net", true */ 'y', 'c', 'l', 'a', 'n', '.', 'n', 'e', 't', '\0', /* "yecl.net", true */ 'y', 'e', 'c', 'l', '.', 'n', 'e', 't', '\0', /* "yesdevnull.net", true */ 'y', 'e', 's', 'd', 'e', 'v', 'n', 'u', 'l', 'l', '.', 'n', 'e', 't', '\0', @@ -18027,7 +18027,6 @@ static const char kSTSHostTable[] = { /* "yhori.xyz", true */ 'y', 'h', 'o', 'r', 'i', '.', 'x', 'y', 'z', '\0', /* "yhrd.org", true */ 'y', 'h', 'r', 'd', '.', 'o', 'r', 'g', '\0', /* "yii2.cc", true */ 'y', 'i', 'i', '2', '.', 'c', 'c', '\0', - /* "yikzu.cn", true */ 'y', 'i', 'k', 'z', 'u', '.', 'c', 'n', '\0', /* "yinfor.com", true */ 'y', 'i', 'n', 'f', 'o', 'r', '.', 'c', 'o', 'm', '\0', /* "yingatech.com", true */ 'y', 'i', 'n', 'g', 'a', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0', /* "yinlei.org", true */ 'y', 'i', 'n', 'l', 'e', 'i', '.', 'o', 'r', 'g', '\0', @@ -18057,6 +18056,7 @@ static const char kSTSHostTable[] = { /* "yombo.net", true */ 'y', 'o', 'm', 'b', 'o', '.', 'n', 'e', 't', '\0', /* "yomepre.com", true */ 'y', 'o', 'm', 'e', 'p', 'r', 'e', '.', 'c', 'o', 'm', '\0', /* "yooooex.com", true */ 'y', 'o', 'o', 'o', 'o', 'e', 'x', '.', 'c', 'o', 'm', '\0', + /* "yoramvandevelde.net", true */ 'y', 'o', 'r', 'a', 'm', 'v', 'a', 'n', 'd', 'e', 'v', 'e', 'l', 'd', 'e', '.', 'n', 'e', 't', '\0', /* "yorcom.nl", false */ 'y', 'o', 'r', 'c', 'o', 'm', '.', 'n', 'l', '\0', /* "yorkshireterrier.com.br", true */ 'y', 'o', 'r', 'k', 's', 'h', 'i', 'r', 'e', 't', 'e', 'r', 'r', 'i', 'e', 'r', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0', /* "yorname.ml", true */ 'y', 'o', 'r', 'n', 'a', 'm', 'e', '.', 'm', 'l', '\0', @@ -18075,6 +18075,7 @@ static const char kSTSHostTable[] = { /* "youngdogs.org", true */ 'y', 'o', 'u', 'n', 'g', 'd', 'o', 'g', 's', '.', 'o', 'r', 'g', '\0', /* "youpark.no", true */ 'y', 'o', 'u', 'p', 'a', 'r', 'k', '.', 'n', 'o', '\0', /* "youran.me", true */ 'y', 'o', 'u', 'r', 'a', 'n', '.', 'm', 'e', '\0', + /* "yourciso.com", true */ 'y', 'o', 'u', 'r', 'c', 'i', 's', 'o', '.', 'c', 'o', 'm', '\0', /* "yourcopywriter.it", true */ 'y', 'o', 'u', 'r', 'c', 'o', 'p', 'y', 'w', 'r', 'i', 't', 'e', 'r', '.', 'i', 't', '\0', /* "yourdaddy.dk", true */ 'y', 'o', 'u', 'r', 'd', 'a', 'd', 'd', 'y', '.', 'd', 'k', '\0', /* "yourgame.co.il", true */ 'y', 'o', 'u', 'r', 'g', 'a', 'm', 'e', '.', 'c', 'o', '.', 'i', 'l', '\0', @@ -18357,18302 +18358,18303 @@ static const nsSTSPreload kSTSPreloadList[] = { { 182, true }, { 193, true }, { 199, true }, - { 205, true }, - { 213, true }, - { 222, true }, - { 231, true }, - { 240, true }, - { 249, true }, - { 264, true }, - { 272, true }, - { 280, true }, - { 288, true }, - { 298, true }, - { 308, true }, - { 317, true }, - { 325, true }, - { 338, true }, - { 346, true }, - { 354, true }, - { 361, true }, - { 371, true }, - { 385, true }, - { 400, true }, - { 410, false }, - { 433, true }, - { 453, true }, - { 465, true }, - { 481, true }, - { 493, true }, - { 505, true }, - { 530, true }, - { 538, true }, + { 207, true }, + { 216, true }, + { 225, true }, + { 234, true }, + { 243, true }, + { 258, true }, + { 266, true }, + { 274, true }, + { 282, true }, + { 292, true }, + { 302, true }, + { 311, true }, + { 322, true }, + { 330, true }, + { 343, true }, + { 351, true }, + { 359, true }, + { 366, true }, + { 376, true }, + { 390, true }, + { 400, false }, + { 423, true }, + { 443, true }, + { 455, true }, + { 471, true }, + { 483, true }, + { 495, true }, + { 520, true }, + { 528, true }, + { 536, true }, { 546, true }, - { 556, true }, - { 567, true }, - { 588, true }, - { 595, true }, - { 610, true }, - { 624, true }, - { 636, true }, - { 647, true }, - { 658, true }, + { 557, true }, + { 578, true }, + { 585, true }, + { 600, true }, + { 614, true }, + { 626, true }, + { 637, true }, + { 648, true }, + { 659, true }, { 669, true }, { 679, true }, - { 689, true }, - { 714, true }, - { 739, true }, + { 704, true }, + { 729, true }, + { 737, true }, { 747, true }, - { 757, true }, - { 765, true }, - { 783, true }, - { 794, true }, - { 819, true }, - { 830, true }, - { 841, false }, - { 857, true }, - { 868, true }, - { 889, true }, - { 905, true }, - { 913, false }, - { 925, true }, - { 950, true }, - { 972, true }, - { 989, true }, + { 755, true }, + { 773, true }, + { 784, true }, + { 809, true }, + { 820, true }, + { 831, false }, + { 847, true }, + { 858, true }, + { 879, true }, + { 895, true }, + { 903, false }, + { 915, true }, + { 940, true }, + { 962, true }, + { 979, true }, + { 1002, true }, { 1012, true }, - { 1022, true }, - { 1033, true }, - { 1046, true }, - { 1060, true }, - { 1067, true }, - { 1089, true }, - { 1101, true }, - { 1108, true }, - { 1119, true }, - { 1126, true }, - { 1137, true }, - { 1148, false }, - { 1154, true }, + { 1023, true }, + { 1036, true }, + { 1050, true }, + { 1057, true }, + { 1079, true }, + { 1091, true }, + { 1098, true }, + { 1109, true }, + { 1116, true }, + { 1127, true }, + { 1138, false }, + { 1144, true }, + { 1157, true }, { 1167, true }, - { 1177, true }, - { 1184, true }, - { 1191, true }, - { 1202, true }, - { 1209, true }, - { 1221, true }, - { 1238, true }, - { 1256, true }, - { 1270, true }, - { 1282, true }, - { 1293, true }, - { 1302, true }, - { 1308, true }, - { 1322, true }, - { 1337, true }, - { 1345, true }, - { 1354, true }, - { 1362, true }, + { 1174, true }, + { 1181, true }, + { 1192, true }, + { 1199, true }, + { 1211, true }, + { 1228, true }, + { 1246, true }, + { 1260, true }, + { 1272, true }, + { 1283, true }, + { 1292, true }, + { 1298, true }, + { 1312, true }, + { 1327, true }, + { 1335, true }, + { 1344, true }, + { 1352, true }, + { 1363, true }, { 1373, true }, - { 1383, true }, - { 1401, true }, - { 1419, true }, - { 1428, true }, - { 1436, true }, - { 1444, false }, - { 1455, true }, - { 1473, true }, - { 1484, true }, - { 1496, true }, - { 1510, true }, - { 1518, true }, - { 1531, true }, - { 1541, false }, - { 1554, true }, - { 1563, true }, - { 1577, true }, - { 1586, true }, - { 1607, true }, - { 1616, true }, - { 1628, true }, - { 1638, true }, - { 1653, true }, - { 1661, true }, - { 1678, true }, - { 1691, true }, - { 1708, false }, - { 1720, true }, - { 1728, true }, - { 1739, true }, - { 1746, true }, - { 1755, true }, - { 1764, true }, - { 1777, true }, - { 1786, true }, - { 1805, true }, - { 1816, true }, - { 1835, true }, - { 1854, true }, - { 1866, true }, - { 1880, true }, - { 1892, false }, - { 1903, true }, - { 1912, false }, - { 1923, true }, - { 1938, true }, - { 1951, true }, - { 1959, true }, - { 1973, true }, - { 1988, true }, - { 2000, true }, - { 2013, true }, - { 2028, true }, - { 2037, true }, - { 2047, true }, - { 2061, true }, - { 2075, true }, - { 2084, true }, - { 2098, true }, - { 2106, true }, - { 2113, true }, - { 2124, true }, - { 2137, true }, - { 2146, true }, - { 2158, true }, - { 2169, true }, - { 2180, true }, - { 2190, true }, - { 2201, true }, - { 2212, true }, - { 2225, true }, - { 2233, true }, - { 2244, false }, - { 2257, true }, - { 2265, true }, - { 2277, true }, - { 2292, true }, - { 2311, true }, - { 2322, true }, - { 2329, true }, - { 2339, true }, - { 2345, true }, - { 2354, true }, - { 2367, true }, - { 2381, true }, - { 2393, true }, - { 2402, true }, - { 2415, true }, - { 2425, true }, - { 2435, false }, - { 2442, true }, - { 2453, true }, - { 2465, true }, + { 1391, true }, + { 1409, true }, + { 1418, true }, + { 1426, true }, + { 1434, false }, + { 1445, true }, + { 1463, true }, + { 1474, true }, + { 1483, true }, + { 1495, true }, + { 1509, true }, + { 1517, true }, + { 1530, true }, + { 1540, false }, + { 1553, true }, + { 1562, true }, + { 1576, true }, + { 1585, true }, + { 1606, true }, + { 1615, true }, + { 1627, true }, + { 1637, true }, + { 1652, true }, + { 1660, true }, + { 1677, true }, + { 1690, true }, + { 1707, false }, + { 1719, true }, + { 1727, true }, + { 1738, true }, + { 1745, true }, + { 1754, true }, + { 1763, true }, + { 1776, true }, + { 1785, true }, + { 1804, true }, + { 1815, true }, + { 1834, true }, + { 1853, true }, + { 1865, true }, + { 1879, true }, + { 1891, false }, + { 1902, true }, + { 1911, false }, + { 1922, true }, + { 1937, true }, + { 1950, true }, + { 1958, true }, + { 1972, true }, + { 1987, true }, + { 1999, true }, + { 2012, true }, + { 2027, true }, + { 2036, true }, + { 2046, true }, + { 2060, true }, + { 2074, true }, + { 2083, true }, + { 2097, true }, + { 2105, true }, + { 2112, true }, + { 2123, true }, + { 2136, true }, + { 2145, true }, + { 2157, true }, + { 2168, true }, + { 2179, true }, + { 2189, true }, + { 2200, true }, + { 2211, true }, + { 2224, true }, + { 2232, true }, + { 2243, false }, + { 2256, true }, + { 2264, true }, + { 2276, true }, + { 2291, true }, + { 2310, true }, + { 2321, true }, + { 2328, true }, + { 2338, true }, + { 2344, true }, + { 2353, true }, + { 2366, true }, + { 2375, true }, + { 2389, true }, + { 2401, true }, + { 2410, true }, + { 2423, true }, + { 2433, true }, + { 2443, false }, + { 2450, true }, + { 2461, true }, { 2473, true }, - { 2480, true }, - { 2489, true }, - { 2499, true }, - { 2518, true }, - { 2530, true }, - { 2539, true }, - { 2560, true }, - { 2584, true }, - { 2599, true }, + { 2481, true }, + { 2488, true }, + { 2497, true }, + { 2507, true }, + { 2526, true }, + { 2538, true }, + { 2547, true }, + { 2568, true }, + { 2592, true }, { 2607, true }, - { 2618, true }, - { 2624, true }, - { 2637, true }, - { 2649, true }, - { 2661, true }, + { 2615, true }, + { 2626, true }, + { 2632, true }, + { 2645, true }, + { 2657, true }, { 2669, true }, - { 2685, true }, - { 2695, true }, - { 2712, true }, - { 2719, true }, - { 2728, true }, - { 2749, true }, - { 2762, false }, - { 2775, true }, - { 2785, true }, - { 2838, true }, - { 2850, true }, - { 2859, true }, - { 2868, true }, - { 2878, true }, - { 2888, true }, - { 2899, true }, + { 2677, true }, + { 2693, true }, + { 2703, true }, + { 2720, true }, + { 2727, true }, + { 2736, true }, + { 2757, true }, + { 2770, false }, + { 2783, true }, + { 2793, true }, + { 2846, true }, + { 2858, true }, + { 2867, true }, + { 2876, true }, + { 2886, true }, + { 2896, true }, { 2907, true }, - { 2914, true }, - { 2926, true }, - { 2935, true }, - { 2957, true }, - { 2973, true }, - { 2997, true }, - { 3007, true }, - { 3018, true }, - { 3037, true }, - { 3048, true }, - { 3062, true }, - { 3076, true }, - { 3086, true }, - { 3097, true }, - { 3106, true }, - { 3119, true }, - { 3134, true }, - { 3149, true }, + { 2915, true }, + { 2922, true }, + { 2934, true }, + { 2943, true }, + { 2965, true }, + { 2981, true }, + { 3005, true }, + { 3015, true }, + { 3026, true }, + { 3045, true }, + { 3056, true }, + { 3070, true }, + { 3084, true }, + { 3094, true }, + { 3105, true }, + { 3114, true }, + { 3127, true }, + { 3142, true }, { 3157, true }, - { 3174, true }, - { 3189, true }, - { 3204, true }, - { 3219, true }, - { 3231, true }, - { 3247, true }, - { 3257, true }, - { 3264, true }, - { 3275, true }, - { 3290, true }, - { 3300, true }, - { 3328, true }, - { 3342, true }, - { 3362, true }, - { 3381, true }, - { 3391, true }, - { 3402, true }, - { 3420, true }, - { 3431, true }, - { 3445, true }, - { 3458, true }, - { 3470, true }, - { 3492, true }, - { 3508, true }, - { 3519, false }, - { 3535, false }, - { 3547, true }, - { 3560, true }, - { 3577, true }, - { 3602, true }, - { 3619, false }, - { 3627, true }, - { 3636, true }, - { 3660, true }, - { 3673, true }, - { 3685, true }, - { 3696, true }, - { 3714, true }, - { 3738, true }, - { 3745, true }, - { 3758, true }, - { 3771, true }, - { 3780, true }, - { 3797, true }, - { 3816, true }, - { 3828, true }, - { 3847, true }, - { 3870, true }, - { 3893, true }, - { 3907, true }, - { 3915, true }, - { 3931, true }, - { 3944, true }, - { 3961, true }, - { 3981, true }, - { 3994, true }, - { 4012, true }, - { 4033, true }, - { 4053, true }, - { 4078, true }, - { 4090, true }, + { 3165, true }, + { 3182, true }, + { 3197, true }, + { 3212, true }, + { 3227, true }, + { 3239, true }, + { 3255, true }, + { 3265, true }, + { 3272, true }, + { 3283, true }, + { 3298, true }, + { 3308, true }, + { 3336, true }, + { 3350, true }, + { 3370, true }, + { 3389, true }, + { 3399, true }, + { 3410, true }, + { 3428, true }, + { 3439, true }, + { 3453, true }, + { 3466, true }, + { 3478, true }, + { 3500, true }, + { 3516, true }, + { 3527, false }, + { 3543, false }, + { 3555, true }, + { 3568, true }, + { 3585, true }, + { 3610, true }, + { 3627, false }, + { 3635, true }, + { 3659, true }, + { 3672, true }, + { 3684, true }, + { 3695, true }, + { 3713, true }, + { 3737, true }, + { 3744, true }, + { 3757, true }, + { 3770, true }, + { 3779, true }, + { 3796, true }, + { 3815, true }, + { 3827, true }, + { 3846, true }, + { 3869, true }, + { 3892, true }, + { 3906, true }, + { 3914, true }, + { 3938, true }, + { 3954, true }, + { 3967, true }, + { 3984, true }, + { 4004, true }, + { 4017, true }, + { 4035, true }, + { 4056, true }, + { 4076, true }, { 4101, true }, - { 4120, true }, - { 4139, false }, - { 4146, true }, - { 4159, true }, - { 4180, true }, - { 4192, true }, - { 4209, true }, - { 4222, true }, - { 4238, true }, - { 4259, true }, - { 4271, true }, + { 4113, true }, + { 4124, true }, + { 4143, true }, + { 4162, false }, + { 4169, true }, + { 4182, true }, + { 4203, true }, + { 4215, true }, + { 4232, true }, + { 4245, true }, + { 4261, true }, { 4282, true }, - { 4295, false }, - { 4304, true }, - { 4320, false }, - { 4330, true }, - { 4345, true }, - { 4362, true }, - { 4373, true }, - { 4387, true }, - { 4400, true }, - { 4416, true }, - { 4427, true }, + { 4294, true }, + { 4305, true }, + { 4318, false }, + { 4327, true }, + { 4343, false }, + { 4353, true }, + { 4368, true }, + { 4385, true }, + { 4396, false }, + { 4410, true }, + { 4423, true }, { 4439, true }, - { 4451, true }, - { 4472, false }, - { 4482, true }, - { 4497, true }, - { 4511, false }, - { 4524, true }, - { 4533, true }, - { 4548, true }, - { 4564, true }, - { 4578, true }, - { 4590, true }, - { 4605, true }, - { 4618, true }, - { 4630, true }, - { 4642, true }, - { 4654, true }, - { 4666, true }, - { 4678, true }, - { 4686, true }, - { 4697, true }, - { 4714, true }, - { 4728, true }, - { 4744, true }, - { 4758, true }, - { 4771, true }, - { 4788, true }, - { 4804, true }, - { 4819, true }, - { 4834, true }, - { 4852, true }, - { 4861, true }, - { 4874, true }, - { 4889, true }, - { 4910, true }, - { 4919, true }, - { 4929, true }, - { 4954, true }, - { 4965, true }, + { 4450, true }, + { 4462, true }, + { 4474, true }, + { 4495, false }, + { 4505, true }, + { 4520, true }, + { 4534, false }, + { 4547, true }, + { 4556, true }, + { 4571, true }, + { 4587, true }, + { 4601, true }, + { 4613, true }, + { 4628, true }, + { 4641, true }, + { 4653, true }, + { 4665, true }, + { 4677, true }, + { 4689, true }, + { 4701, true }, + { 4709, true }, + { 4720, true }, + { 4737, true }, + { 4751, true }, + { 4767, true }, + { 4781, true }, + { 4794, true }, + { 4811, true }, + { 4827, true }, + { 4842, true }, + { 4857, true }, + { 4875, true }, + { 4884, true }, + { 4897, true }, + { 4912, true }, + { 4933, true }, + { 4942, true }, + { 4952, true }, { 4977, true }, - { 4996, true }, - { 5008, true }, - { 5027, true }, - { 5046, true }, - { 5065, true }, - { 5076, true }, + { 4988, true }, + { 5000, true }, + { 5019, true }, + { 5031, true }, + { 5050, true }, + { 5069, true }, { 5088, true }, - { 5103, true }, - { 5114, true }, - { 5127, true }, - { 5140, true }, - { 5154, true }, - { 5169, true }, - { 5191, true }, - { 5201, true }, - { 5223, true }, - { 5232, true }, - { 5245, true }, - { 5259, true }, - { 5271, true }, - { 5284, true }, - { 5311, true }, - { 5337, true }, - { 5348, true }, - { 5361, true }, + { 5099, true }, + { 5111, true }, + { 5126, true }, + { 5137, true }, + { 5150, true }, + { 5162, true }, + { 5175, true }, + { 5189, true }, + { 5204, true }, + { 5226, true }, + { 5236, true }, + { 5258, true }, + { 5267, true }, + { 5280, true }, + { 5294, true }, + { 5306, true }, + { 5319, true }, + { 5346, true }, { 5372, true }, + { 5383, true }, { 5396, true }, - { 5413, true }, - { 5441, true }, - { 5453, true }, - { 5464, true }, - { 5473, true }, - { 5483, true }, - { 5497, true }, - { 5516, true }, - { 5526, true }, - { 5543, true }, - { 5555, true }, - { 5569, true }, - { 5577, false }, - { 5598, true }, - { 5616, true }, - { 5637, true }, - { 5648, true }, - { 5661, true }, + { 5407, true }, + { 5431, true }, + { 5448, true }, + { 5476, true }, + { 5488, true }, + { 5499, true }, + { 5508, true }, + { 5518, true }, + { 5532, true }, + { 5551, true }, + { 5561, true }, + { 5578, true }, + { 5590, true }, + { 5604, true }, + { 5612, false }, + { 5633, true }, + { 5651, true }, { 5672, true }, - { 5681, true }, - { 5697, true }, - { 5713, true }, + { 5683, true }, + { 5696, true }, + { 5707, true }, + { 5716, true }, { 5732, true }, - { 5753, true }, + { 5748, true }, { 5767, true }, - { 5786, true }, - { 5799, true }, - { 5810, true }, - { 5830, true }, - { 5848, true }, - { 5866, false }, - { 5885, true }, - { 5899, true }, + { 5788, true }, + { 5802, true }, + { 5821, true }, + { 5834, true }, + { 5845, true }, + { 5865, true }, + { 5883, true }, + { 5901, false }, { 5920, true }, - { 5940, true }, - { 5956, true }, - { 5966, true }, - { 5979, true }, - { 5992, true }, - { 6006, true }, - { 6020, true }, - { 6030, true }, - { 6040, true }, - { 6050, true }, - { 6060, true }, - { 6070, true }, - { 6080, true }, - { 6097, true }, - { 6107, false }, + { 5934, true }, + { 5955, true }, + { 5975, true }, + { 5991, true }, + { 6001, true }, + { 6014, true }, + { 6027, true }, + { 6041, true }, + { 6055, true }, + { 6065, true }, + { 6075, true }, + { 6085, true }, + { 6095, true }, + { 6105, true }, { 6115, true }, - { 6126, true }, - { 6137, true }, - { 6149, true }, - { 6160, true }, + { 6132, true }, + { 6142, false }, + { 6150, true }, + { 6161, true }, { 6172, true }, - { 6183, true }, - { 6201, true }, - { 6210, true }, - { 6230, true }, - { 6241, true }, - { 6258, true }, - { 6282, true }, - { 6296, true }, - { 6315, true }, - { 6337, true }, - { 6347, true }, - { 6359, true }, - { 6375, true }, - { 6386, true }, + { 6184, true }, + { 6195, true }, + { 6207, true }, + { 6218, true }, + { 6236, true }, + { 6245, true }, + { 6265, true }, + { 6276, true }, + { 6293, true }, + { 6317, true }, + { 6331, true }, + { 6350, true }, + { 6372, true }, + { 6382, true }, { 6394, true }, - { 6408, true }, - { 6424, true }, - { 6433, true }, - { 6448, true }, - { 6456, true }, - { 6465, true }, - { 6482, true }, - { 6491, true }, - { 6510, true }, - { 6527, true }, - { 6535, false }, - { 6551, true }, - { 6569, true }, - { 6580, true }, - { 6593, true }, + { 6410, true }, + { 6421, true }, + { 6429, true }, + { 6443, true }, + { 6459, true }, + { 6474, true }, + { 6483, true }, + { 6498, true }, + { 6506, true }, + { 6515, true }, + { 6532, true }, + { 6541, true }, + { 6560, true }, + { 6577, true }, + { 6585, false }, { 6601, true }, - { 6615, false }, - { 6629, true }, - { 6641, true }, - { 6651, false }, - { 6664, true }, - { 6676, true }, - { 6688, true }, - { 6702, true }, - { 6715, true }, - { 6727, true }, - { 6743, true }, - { 6753, false }, - { 6763, true }, - { 6771, true }, - { 6781, true }, - { 6795, true }, - { 6808, true }, - { 6816, true }, - { 6828, true }, - { 6840, true }, - { 6864, true }, - { 6883, true }, - { 6902, false }, - { 6911, true }, - { 6925, true }, - { 6935, true }, - { 6968, true }, - { 6978, true }, - { 6992, true }, - { 6999, true }, - { 7011, true }, - { 7024, true }, + { 6619, true }, + { 6630, true }, + { 6643, true }, + { 6651, true }, + { 6665, false }, + { 6679, true }, + { 6691, true }, + { 6701, false }, + { 6714, true }, + { 6726, true }, + { 6738, true }, + { 6752, true }, + { 6765, true }, + { 6777, true }, + { 6793, true }, + { 6803, false }, + { 6813, true }, + { 6821, true }, + { 6831, true }, + { 6845, true }, + { 6858, true }, + { 6866, true }, + { 6878, true }, + { 6890, true }, + { 6914, true }, + { 6933, true }, + { 6952, false }, + { 6961, true }, + { 6971, true }, + { 7004, true }, + { 7014, true }, + { 7028, true }, { 7035, true }, - { 7052, true }, - { 7063, true }, - { 7079, true }, + { 7047, true }, + { 7060, true }, + { 7071, true }, { 7088, true }, - { 7095, true }, - { 7109, true }, - { 7117, true }, - { 7128, true }, - { 7146, true }, - { 7161, true }, - { 7176, true }, - { 7193, true }, - { 7206, true }, - { 7216, true }, - { 7227, true }, + { 7099, true }, + { 7115, true }, + { 7124, true }, + { 7131, true }, + { 7145, true }, + { 7153, true }, + { 7164, true }, + { 7182, true }, + { 7197, true }, + { 7212, true }, + { 7229, true }, { 7242, true }, - { 7265, true }, - { 7276, true }, - { 7288, true }, - { 7299, true }, - { 7319, true }, - { 7330, true }, - { 7341, true }, - { 7352, true }, - { 7363, true }, - { 7374, true }, - { 7387, true }, - { 7405, true }, - { 7417, true }, - { 7434, true }, + { 7253, true }, + { 7268, true }, + { 7291, true }, + { 7302, true }, + { 7314, true }, + { 7325, true }, + { 7345, true }, + { 7356, true }, + { 7367, true }, + { 7378, true }, + { 7389, true }, + { 7400, true }, + { 7413, true }, + { 7431, true }, { 7443, true }, - { 7457, true }, - { 7468, true }, - { 7479, true }, - { 7496, true }, - { 7512, true }, - { 7523, true }, - { 7531, false }, + { 7460, true }, + { 7469, true }, + { 7483, true }, + { 7494, true }, + { 7505, true }, + { 7522, true }, + { 7538, true }, + { 7549, true }, { 7557, false }, - { 7568, true }, - { 7586, false }, - { 7603, true }, - { 7613, true }, - { 7624, true }, - { 7637, true }, - { 7649, true }, - { 7658, true }, + { 7583, false }, + { 7594, true }, + { 7612, false }, + { 7629, true }, + { 7639, true }, + { 7650, true }, + { 7663, true }, { 7675, true }, - { 7682, true }, - { 7706, true }, - { 7722, true }, - { 7742, true }, - { 7767, true }, - { 7792, true }, - { 7817, true }, - { 7829, true }, - { 7839, true }, - { 7851, true }, - { 7860, true }, - { 7872, true }, - { 7899, true }, - { 7927, true }, - { 7940, false }, - { 7949, true }, - { 7965, true }, - { 7981, true }, - { 7993, true }, + { 7684, true }, + { 7701, true }, + { 7708, true }, + { 7732, true }, + { 7748, true }, + { 7768, true }, + { 7793, true }, + { 7818, true }, + { 7843, true }, + { 7855, true }, + { 7865, true }, + { 7877, true }, + { 7886, true }, + { 7898, true }, + { 7925, true }, + { 7953, true }, + { 7966, false }, + { 7975, true }, + { 7991, true }, { 8007, true }, - { 8027, true }, - { 8042, true }, - { 8063, true }, - { 8074, true }, - { 8084, true }, - { 8095, true }, - { 8107, true }, - { 8119, true }, - { 8128, true }, - { 8140, true }, - { 8159, true }, - { 8172, true }, - { 8183, true }, - { 8192, true }, - { 8210, true }, - { 8224, true }, - { 8238, true }, - { 8254, true }, - { 8270, true }, - { 8290, true }, - { 8311, true }, - { 8325, true }, - { 8338, true }, - { 8353, true }, - { 8363, true }, - { 8381, true }, - { 8396, true }, - { 8414, true }, - { 8424, true }, - { 8439, true }, - { 8457, true }, - { 8471, true }, - { 8485, true }, - { 8499, true }, + { 8019, true }, + { 8033, true }, + { 8053, true }, + { 8068, true }, + { 8089, true }, + { 8100, true }, + { 8110, true }, + { 8121, true }, + { 8133, true }, + { 8145, true }, + { 8154, true }, + { 8166, true }, + { 8185, true }, + { 8198, true }, + { 8209, true }, + { 8218, true }, + { 8236, true }, + { 8250, true }, + { 8264, true }, + { 8280, true }, + { 8296, true }, + { 8316, true }, + { 8337, true }, + { 8351, true }, + { 8364, true }, + { 8379, true }, + { 8389, true }, + { 8407, true }, + { 8422, true }, + { 8440, true }, + { 8450, true }, + { 8465, true }, + { 8483, true }, + { 8497, true }, { 8511, true }, - { 8526, true }, - { 8540, true }, - { 8555, true }, - { 8565, true }, - { 8579, true }, - { 8588, true }, + { 8525, true }, + { 8537, true }, + { 8552, true }, + { 8566, true }, + { 8581, true }, + { 8591, true }, { 8605, true }, - { 8620, true }, - { 8634, true }, - { 8648, true }, - { 8664, true }, - { 8676, true }, - { 8689, false }, - { 8704, true }, - { 8731, true }, - { 8743, true }, + { 8614, true }, + { 8631, true }, + { 8646, true }, + { 8660, true }, + { 8674, true }, + { 8690, true }, + { 8702, true }, + { 8715, false }, + { 8730, true }, { 8757, true }, - { 8767, true }, - { 8782, true }, - { 8796, true }, - { 8810, true }, - { 8832, true }, - { 8844, true }, - { 8867, true }, - { 8888, true }, - { 8900, true }, - { 8912, true }, - { 8925, true }, - { 8936, true }, + { 8769, true }, + { 8783, true }, + { 8793, true }, + { 8808, true }, + { 8822, true }, + { 8836, true }, + { 8858, true }, + { 8870, true }, + { 8893, true }, + { 8914, true }, + { 8926, true }, + { 8938, true }, { 8951, true }, - { 8962, false }, - { 8978, true }, - { 8996, true }, - { 9007, true }, - { 9019, true }, - { 9032, true }, - { 9052, true }, - { 9065, true }, + { 8962, true }, + { 8977, true }, + { 8988, false }, + { 9004, true }, + { 9022, true }, + { 9033, true }, + { 9045, true }, + { 9058, true }, { 9078, true }, - { 9102, true }, - { 9120, true }, - { 9137, true }, - { 9161, true }, - { 9185, true }, - { 9204, true }, - { 9220, true }, - { 9234, true }, - { 9243, true }, - { 9256, true }, - { 9273, true }, - { 9294, true }, - { 9310, true }, - { 9331, true }, - { 9347, true }, - { 9366, true }, - { 9379, true }, - { 9400, true }, - { 9420, true }, - { 9440, true }, - { 9456, true }, - { 9469, false }, + { 9091, true }, + { 9104, true }, + { 9128, true }, + { 9146, true }, + { 9163, true }, + { 9187, true }, + { 9211, true }, + { 9230, true }, + { 9246, true }, + { 9260, true }, + { 9269, true }, + { 9282, true }, + { 9299, true }, + { 9320, true }, + { 9336, true }, + { 9357, true }, + { 9373, true }, + { 9392, true }, + { 9405, true }, + { 9426, true }, + { 9446, true }, + { 9466, true }, { 9482, true }, - { 9494, true }, - { 9504, true }, - { 9517, true }, - { 9531, true }, - { 9547, true }, - { 9561, true }, - { 9577, true }, - { 9589, true }, + { 9495, false }, + { 9508, true }, + { 9520, true }, + { 9530, true }, + { 9543, true }, + { 9557, true }, + { 9573, true }, + { 9587, true }, { 9603, true }, - { 9620, true }, - { 9631, true }, - { 9650, true }, - { 9663, true }, - { 9677, true }, - { 9685, true }, - { 9698, true }, + { 9615, true }, + { 9629, true }, + { 9646, true }, + { 9657, true }, + { 9676, true }, + { 9689, true }, + { 9703, true }, { 9711, true }, - { 9726, true }, - { 9740, true }, - { 9757, true }, - { 9776, true }, - { 9788, true }, + { 9724, true }, + { 9737, true }, + { 9752, true }, + { 9766, true }, + { 9783, true }, { 9802, true }, - { 9824, true }, - { 9838, true }, + { 9814, true }, + { 9828, true }, { 9850, true }, - { 9862, true }, + { 9864, true }, { 9876, true }, - { 9904, true }, - { 9919, true }, - { 9931, true }, - { 9942, true }, - { 9953, true }, - { 9967, true }, + { 9888, true }, + { 9902, true }, + { 9930, true }, + { 9945, true }, + { 9957, true }, + { 9968, true }, { 9979, true }, - { 9987, true }, - { 9998, true }, - { 10006, true }, - { 10014, true }, - { 10022, true }, - { 10030, true }, - { 10043, true }, - { 10050, true }, - { 10060, true }, - { 10073, true }, - { 10085, true }, - { 10098, true }, - { 10118, true }, - { 10130, true }, - { 10142, true }, - { 10160, true }, - { 10175, true }, - { 10188, true }, - { 10197, true }, - { 10210, true }, - { 10222, true }, + { 9993, true }, + { 10005, true }, + { 10013, true }, + { 10024, true }, + { 10032, true }, + { 10040, true }, + { 10048, true }, + { 10056, true }, + { 10069, true }, + { 10076, true }, + { 10086, true }, + { 10099, true }, + { 10111, true }, + { 10124, true }, + { 10144, true }, + { 10156, true }, + { 10168, true }, + { 10186, true }, + { 10201, true }, + { 10214, true }, + { 10223, true }, { 10236, true }, - { 10249, true }, - { 10260, true }, - { 10270, true }, - { 10281, true }, - { 10291, true }, - { 10302, true }, - { 10311, true }, - { 10327, true }, - { 10343, true }, - { 10371, true }, - { 10390, true }, - { 10405, true }, - { 10425, true }, - { 10437, true }, - { 10449, true }, - { 10462, true }, - { 10471, true }, - { 10480, true }, - { 10490, true }, - { 10509, true }, - { 10520, true }, + { 10248, true }, + { 10262, true }, + { 10275, true }, + { 10286, true }, + { 10296, true }, + { 10307, true }, + { 10317, true }, + { 10328, true }, + { 10337, true }, + { 10353, true }, + { 10369, true }, + { 10397, true }, + { 10416, true }, + { 10431, true }, + { 10451, true }, + { 10463, true }, + { 10475, true }, + { 10488, true }, + { 10497, true }, + { 10506, true }, + { 10516, true }, { 10535, true }, - { 10555, true }, - { 10573, true }, - { 10583, true }, - { 10610, true }, - { 10627, true }, - { 10638, true }, - { 10648, true }, - { 10662, true }, - { 10679, true }, + { 10546, true }, + { 10561, true }, + { 10581, true }, + { 10599, true }, + { 10609, true }, + { 10636, true }, + { 10653, true }, + { 10664, true }, + { 10674, true }, { 10688, true }, - { 10699, true }, - { 10719, true }, - { 10738, true }, - { 10749, true }, - { 10760, true }, - { 10778, false }, - { 10789, true }, - { 10808, true }, - { 10826, true }, - { 10844, true }, - { 10866, true }, - { 10888, true }, - { 10902, true }, - { 10917, true }, - { 10931, true }, - { 10945, true }, - { 10960, true }, - { 10981, true }, - { 10991, true }, - { 11006, true }, + { 10705, true }, + { 10714, true }, + { 10725, true }, + { 10745, true }, + { 10764, true }, + { 10775, true }, + { 10786, true }, + { 10804, false }, + { 10815, true }, + { 10834, true }, + { 10852, true }, + { 10870, true }, + { 10892, true }, + { 10914, true }, + { 10928, true }, + { 10943, true }, + { 10957, true }, + { 10971, true }, + { 10986, true }, + { 11007, true }, { 11017, true }, - { 11038, true }, - { 11056, true }, - { 11067, true }, - { 11085, true }, - { 11098, true }, - { 11106, true }, - { 11123, true }, - { 11136, true }, - { 11151, true }, - { 11163, true }, + { 11032, true }, + { 11043, true }, + { 11064, true }, + { 11082, true }, + { 11093, true }, + { 11111, true }, + { 11124, true }, + { 11132, true }, + { 11149, true }, + { 11162, true }, { 11177, true }, - { 11196, true }, - { 11214, true }, - { 11236, true }, - { 11251, true }, - { 11268, true }, - { 11290, true }, - { 11305, true }, - { 11322, true }, - { 11343, true }, - { 11359, true }, - { 11386, true }, - { 11402, true }, - { 11419, true }, - { 11436, true }, - { 11451, true }, - { 11466, true }, - { 11480, true }, - { 11494, true }, - { 11511, true }, + { 11189, true }, + { 11203, true }, + { 11222, true }, + { 11240, true }, + { 11262, true }, + { 11277, true }, + { 11294, true }, + { 11316, true }, + { 11331, true }, + { 11348, true }, + { 11369, true }, + { 11385, true }, + { 11412, true }, + { 11428, true }, + { 11445, true }, + { 11462, true }, + { 11477, true }, + { 11492, true }, + { 11506, true }, { 11523, true }, - { 11541, true }, - { 11558, true }, - { 11572, true }, - { 11589, true }, - { 11607, true }, - { 11622, true }, - { 11634, true }, - { 11650, true }, - { 11664, true }, - { 11677, true }, - { 11694, true }, - { 11714, true }, - { 11734, true }, - { 11749, true }, - { 11760, true }, - { 11771, true }, - { 11782, true }, - { 11798, true }, - { 11813, true }, - { 11824, true }, - { 11841, true }, - { 11857, true }, - { 11868, true }, - { 11879, true }, - { 11891, true }, - { 11904, true }, - { 11923, true }, - { 11934, true }, - { 11947, true }, - { 11961, true }, - { 11979, false }, - { 11992, true }, - { 12014, true }, - { 12031, true }, - { 12048, true }, - { 12068, true }, - { 12079, true }, - { 12090, true }, + { 11540, true }, + { 11552, true }, + { 11570, true }, + { 11587, true }, + { 11601, true }, + { 11618, true }, + { 11636, true }, + { 11651, true }, + { 11663, true }, + { 11679, true }, + { 11693, true }, + { 11706, true }, + { 11723, true }, + { 11743, true }, + { 11763, true }, + { 11778, true }, + { 11789, true }, + { 11800, true }, + { 11811, true }, + { 11827, true }, + { 11842, true }, + { 11853, true }, + { 11870, true }, + { 11886, true }, + { 11897, true }, + { 11908, true }, + { 11920, true }, + { 11933, true }, + { 11952, true }, + { 11963, true }, + { 11976, true }, + { 11990, true }, + { 12008, false }, + { 12021, true }, + { 12043, true }, + { 12060, true }, + { 12077, true }, + { 12097, true }, { 12108, true }, - { 12140, true }, - { 12167, true }, - { 12179, true }, - { 12189, true }, - { 12207, true }, - { 12222, true }, - { 12234, true }, - { 12246, true }, - { 12266, true }, - { 12285, true }, - { 12305, true }, - { 12328, false }, - { 12352, true }, - { 12364, true }, - { 12375, true }, - { 12387, true }, - { 12399, true }, - { 12415, true }, - { 12432, true }, - { 12451, true }, - { 12465, true }, - { 12476, true }, - { 12492, true }, - { 12511, true }, - { 12524, true }, - { 12534, true }, - { 12544, true }, - { 12557, true }, - { 12569, false }, - { 12593, true }, - { 12612, true }, - { 12626, true }, - { 12642, true }, - { 12658, true }, - { 12670, true }, - { 12681, true }, - { 12697, true }, - { 12714, true }, - { 12728, true }, - { 12743, true }, - { 12758, true }, - { 12769, true }, - { 12787, true }, - { 12803, true }, - { 12817, true }, - { 12832, true }, - { 12842, true }, - { 12855, true }, - { 12872, false }, - { 12879, true }, - { 12892, true }, - { 12905, true }, - { 12921, true }, - { 12932, true }, - { 12944, true }, - { 12955, true }, - { 12962, true }, - { 12970, false }, - { 12981, true }, - { 12992, true }, - { 13002, true }, - { 13015, false }, - { 13023, true }, - { 13033, true }, - { 13040, true }, - { 13054, false }, - { 13068, true }, - { 13084, true }, - { 13103, true }, - { 13128, true }, - { 13137, true }, - { 13148, true }, - { 13156, true }, - { 13186, true }, - { 13209, true }, - { 13222, true }, - { 13241, true }, - { 13253, true }, - { 13266, false }, - { 13285, true }, - { 13301, false }, - { 13317, true }, - { 13333, false }, - { 13348, false }, - { 13361, true }, - { 13377, true }, - { 13389, true }, - { 13408, true }, - { 13429, true }, - { 13442, true }, - { 13451, true }, - { 13464, true }, - { 13478, true }, - { 13488, true }, - { 13499, true }, - { 13510, true }, - { 13522, true }, - { 13538, true }, - { 13555, false }, - { 13572, true }, - { 13594, true }, - { 13620, true }, - { 13633, true }, - { 13642, true }, - { 13656, true }, - { 13675, true }, - { 13696, true }, - { 13708, true }, - { 13722, true }, - { 13746, true }, - { 13755, true }, - { 13768, true }, - { 13781, true }, - { 13795, true }, - { 13811, true }, - { 13828, true }, - { 13839, true }, - { 13848, true }, - { 13861, true }, - { 13874, true }, - { 13886, true }, - { 13907, false }, - { 13925, true }, - { 13948, true }, - { 13975, true }, - { 13994, false }, - { 14007, true }, - { 14019, true }, - { 14039, true }, - { 14050, true }, - { 14067, true }, - { 14079, true }, - { 14093, true }, - { 14101, true }, - { 14118, true }, - { 14130, true }, - { 14143, true }, - { 14159, true }, - { 14177, true }, - { 14189, true }, - { 14212, true }, - { 14225, true }, - { 14241, true }, - { 14247, true }, - { 14259, true }, - { 14269, true }, - { 14285, true }, - { 14297, true }, - { 14308, true }, - { 14318, true }, - { 14335, true }, - { 14354, true }, - { 14366, false }, - { 14378, true }, - { 14391, true }, - { 14417, true }, - { 14433, true }, - { 14446, true }, - { 14460, true }, - { 14470, true }, - { 14486, true }, - { 14505, true }, - { 14529, true }, - { 14557, true }, - { 14570, true }, - { 14584, true }, - { 14596, true }, - { 14607, true }, - { 14620, true }, - { 14629, true }, - { 14642, true }, - { 14654, true }, - { 14668, true }, - { 14684, true }, - { 14700, true }, - { 14720, true }, - { 14734, true }, + { 12119, true }, + { 12137, true }, + { 12169, true }, + { 12196, true }, + { 12208, true }, + { 12218, true }, + { 12236, true }, + { 12251, true }, + { 12263, true }, + { 12275, true }, + { 12295, true }, + { 12314, true }, + { 12334, true }, + { 12357, false }, + { 12381, true }, + { 12393, true }, + { 12404, true }, + { 12416, true }, + { 12428, true }, + { 12444, true }, + { 12461, true }, + { 12480, true }, + { 12496, true }, + { 12515, true }, + { 12528, true }, + { 12538, true }, + { 12548, true }, + { 12561, true }, + { 12573, false }, + { 12597, true }, + { 12616, true }, + { 12630, true }, + { 12646, true }, + { 12662, true }, + { 12674, true }, + { 12685, true }, + { 12701, true }, + { 12718, true }, + { 12732, true }, + { 12747, true }, + { 12762, true }, + { 12773, true }, + { 12791, true }, + { 12807, true }, + { 12821, true }, + { 12836, true }, + { 12846, true }, + { 12859, true }, + { 12876, false }, + { 12883, true }, + { 12896, true }, + { 12909, true }, + { 12925, true }, + { 12936, true }, + { 12948, true }, + { 12959, true }, + { 12966, true }, + { 12974, false }, + { 12985, true }, + { 12996, true }, + { 13006, true }, + { 13019, true }, + { 13029, true }, + { 13036, true }, + { 13050, false }, + { 13064, true }, + { 13080, true }, + { 13099, true }, + { 13124, true }, + { 13133, true }, + { 13144, true }, + { 13152, true }, + { 13182, true }, + { 13205, true }, + { 13218, true }, + { 13237, true }, + { 13249, true }, + { 13262, false }, + { 13281, true }, + { 13297, false }, + { 13313, true }, + { 13329, false }, + { 13344, false }, + { 13357, true }, + { 13373, true }, + { 13385, true }, + { 13404, true }, + { 13425, true }, + { 13438, true }, + { 13447, true }, + { 13460, true }, + { 13474, true }, + { 13484, true }, + { 13495, true }, + { 13506, true }, + { 13518, true }, + { 13534, true }, + { 13551, false }, + { 13568, true }, + { 13590, true }, + { 13616, true }, + { 13629, true }, + { 13638, true }, + { 13652, true }, + { 13671, true }, + { 13692, true }, + { 13704, true }, + { 13718, true }, + { 13742, true }, + { 13751, true }, + { 13764, true }, + { 13777, true }, + { 13791, true }, + { 13807, true }, + { 13824, true }, + { 13835, true }, + { 13844, true }, + { 13857, true }, + { 13870, true }, + { 13882, true }, + { 13903, false }, + { 13921, true }, + { 13944, true }, + { 13971, true }, + { 13990, false }, + { 14003, true }, + { 14015, true }, + { 14035, true }, + { 14046, true }, + { 14063, true }, + { 14075, true }, + { 14089, true }, + { 14097, true }, + { 14114, true }, + { 14126, true }, + { 14139, true }, + { 14155, true }, + { 14167, true }, + { 14185, true }, + { 14197, true }, + { 14220, true }, + { 14233, true }, + { 14249, true }, + { 14255, true }, + { 14267, true }, + { 14277, true }, + { 14293, true }, + { 14305, true }, + { 14316, true }, + { 14326, true }, + { 14343, true }, + { 14362, true }, + { 14374, false }, + { 14386, true }, + { 14399, true }, + { 14425, true }, + { 14441, true }, + { 14454, true }, + { 14468, true }, + { 14478, true }, + { 14494, true }, + { 14513, true }, + { 14537, true }, + { 14565, true }, + { 14578, true }, + { 14592, true }, + { 14604, true }, + { 14615, true }, + { 14628, true }, + { 14637, true }, + { 14650, true }, + { 14662, true }, + { 14676, true }, + { 14692, true }, + { 14708, true }, + { 14728, true }, { 14742, true }, - { 14756, true }, - { 14774, true }, - { 14794, true }, - { 14816, true }, - { 14828, true }, - { 14843, true }, - { 14859, true }, - { 14873, false }, - { 14886, true }, - { 14901, true }, - { 14914, true }, - { 14932, true }, - { 14946, true }, - { 14955, true }, - { 14967, true }, - { 14985, true }, - { 15005, false }, - { 15020, true }, - { 15033, true }, - { 15046, true }, - { 15056, true }, - { 15070, true }, - { 15096, true }, - { 15106, true }, - { 15120, true }, - { 15132, true }, - { 15150, true }, - { 15168, false }, - { 15184, true }, - { 15194, true }, - { 15206, true }, - { 15217, true }, - { 15230, true }, - { 15246, true }, - { 15268, true }, - { 15283, true }, - { 15294, true }, - { 15304, true }, - { 15326, true }, - { 15341, true }, - { 15360, true }, - { 15373, true }, - { 15391, false }, - { 15406, true }, - { 15426, true }, - { 15437, true }, - { 15449, true }, - { 15462, true }, - { 15482, true }, - { 15494, false }, - { 15508, true }, - { 15518, true }, - { 15531, true }, - { 15549, true }, - { 15563, true }, - { 15576, true }, - { 15589, true }, - { 15601, true }, - { 15615, true }, - { 15635, true }, - { 15648, true }, - { 15662, true }, - { 15675, true }, - { 15687, true }, - { 15705, true }, - { 15717, true }, - { 15728, true }, - { 15739, true }, - { 15752, true }, - { 15765, true }, - { 15780, true }, - { 15791, true }, - { 15802, true }, - { 15817, true }, - { 15828, true }, - { 15838, true }, - { 15850, true }, - { 15871, true }, - { 15882, true }, - { 15891, true }, - { 15898, true }, - { 15912, true }, - { 15922, true }, - { 15935, true }, - { 15948, true }, - { 15960, true }, - { 15971, true }, + { 14750, true }, + { 14764, true }, + { 14782, true }, + { 14802, true }, + { 14824, true }, + { 14836, true }, + { 14851, true }, + { 14867, true }, + { 14881, false }, + { 14894, true }, + { 14909, true }, + { 14922, true }, + { 14940, true }, + { 14954, true }, + { 14963, true }, + { 14975, true }, + { 14993, true }, + { 15013, false }, + { 15028, true }, + { 15041, true }, + { 15054, true }, + { 15064, true }, + { 15078, true }, + { 15104, true }, + { 15114, true }, + { 15128, true }, + { 15140, true }, + { 15158, true }, + { 15176, false }, + { 15192, true }, + { 15202, true }, + { 15214, true }, + { 15225, true }, + { 15238, true }, + { 15254, true }, + { 15276, true }, + { 15291, true }, + { 15302, true }, + { 15312, true }, + { 15334, true }, + { 15349, true }, + { 15368, true }, + { 15381, true }, + { 15399, false }, + { 15414, true }, + { 15434, true }, + { 15445, true }, + { 15457, true }, + { 15470, true }, + { 15490, true }, + { 15502, false }, + { 15516, true }, + { 15526, true }, + { 15539, true }, + { 15557, true }, + { 15571, true }, + { 15584, true }, + { 15597, true }, + { 15609, true }, + { 15623, true }, + { 15643, true }, + { 15656, true }, + { 15670, true }, + { 15683, true }, + { 15695, true }, + { 15713, true }, + { 15725, true }, + { 15736, true }, + { 15747, true }, + { 15760, true }, + { 15773, true }, + { 15788, true }, + { 15799, true }, + { 15810, true }, + { 15825, true }, + { 15836, true }, + { 15846, true }, + { 15858, true }, + { 15879, true }, + { 15890, true }, + { 15899, true }, + { 15906, true }, + { 15920, true }, + { 15930, true }, + { 15943, true }, + { 15956, true }, + { 15968, true }, { 15985, true }, - { 15995, true }, - { 16013, true }, - { 16023, true }, - { 16037, true }, - { 16054, true }, - { 16068, true }, - { 16078, true }, - { 16094, true }, - { 16105, true }, - { 16129, true }, - { 16146, true }, - { 16163, true }, - { 16175, true }, - { 16191, true }, - { 16213, true }, - { 16239, true }, - { 16254, true }, - { 16267, true }, - { 16285, true }, - { 16296, true }, - { 16306, true }, - { 16316, true }, - { 16335, true }, - { 16355, true }, - { 16367, true }, - { 16381, true }, - { 16388, true }, - { 16398, true }, - { 16408, true }, + { 15996, true }, + { 16010, true }, + { 16020, true }, + { 16038, true }, + { 16048, true }, + { 16062, true }, + { 16079, true }, + { 16093, true }, + { 16103, true }, + { 16119, true }, + { 16130, true }, + { 16154, true }, + { 16171, true }, + { 16188, true }, + { 16200, true }, + { 16216, true }, + { 16238, true }, + { 16264, true }, + { 16279, true }, + { 16292, true }, + { 16310, true }, + { 16321, true }, + { 16331, true }, + { 16341, true }, + { 16360, true }, + { 16380, true }, + { 16392, true }, + { 16406, true }, + { 16413, true }, + { 16423, true }, { 16433, true }, - { 16455, true }, - { 16467, true }, - { 16485, true }, - { 16497, true }, + { 16458, true }, + { 16480, true }, + { 16492, true }, { 16510, true }, - { 16530, true }, - { 16558, true }, - { 16568, true }, - { 16578, true }, - { 16586, true }, - { 16598, true }, - { 16607, false }, - { 16627, true }, - { 16634, true }, - { 16650, true }, - { 16666, true }, - { 16681, true }, + { 16522, true }, + { 16535, true }, + { 16555, true }, + { 16583, true }, + { 16593, true }, + { 16603, true }, + { 16611, true }, + { 16623, true }, + { 16632, false }, + { 16652, true }, + { 16659, true }, + { 16675, true }, { 16691, true }, - { 16709, true }, - { 16724, true }, - { 16751, true }, - { 16768, true }, - { 16786, true }, - { 16794, true }, - { 16808, true }, + { 16706, true }, + { 16716, true }, + { 16734, true }, + { 16749, true }, + { 16776, true }, + { 16793, true }, + { 16811, true }, { 16819, true }, - { 16828, true }, - { 16855, true }, - { 16863, true }, - { 16873, true }, - { 16889, true }, - { 16901, true }, - { 16916, true }, - { 16928, true }, - { 16943, true }, - { 16958, true }, - { 16970, true }, - { 16993, true }, - { 17014, true }, - { 17034, true }, - { 17051, true }, - { 17069, true }, - { 17083, true }, - { 17095, true }, - { 17109, true }, - { 17119, true }, - { 17133, true }, + { 16833, true }, + { 16844, true }, + { 16853, true }, + { 16880, true }, + { 16888, true }, + { 16898, true }, + { 16914, true }, + { 16926, true }, + { 16941, true }, + { 16953, true }, + { 16968, true }, + { 16983, true }, + { 16995, true }, + { 17018, true }, + { 17039, true }, + { 17059, true }, + { 17076, true }, + { 17085, true }, + { 17103, true }, + { 17117, true }, + { 17129, true }, { 17143, true }, - { 17158, true }, - { 17173, true }, - { 17184, true }, - { 17197, true }, - { 17209, true }, - { 17222, true }, - { 17234, true }, - { 17242, true }, - { 17255, true }, - { 17273, true }, - { 17294, true }, - { 17315, true }, - { 17336, true }, - { 17350, true }, - { 17366, true }, - { 17378, true }, - { 17390, true }, - { 17402, true }, - { 17414, true }, - { 17427, true }, - { 17437, true }, - { 17446, true }, - { 17456, true }, + { 17153, true }, + { 17167, true }, + { 17177, true }, + { 17192, true }, + { 17207, true }, + { 17218, true }, + { 17231, true }, + { 17243, true }, + { 17256, true }, + { 17268, true }, + { 17276, true }, + { 17289, true }, + { 17307, true }, + { 17328, true }, + { 17349, true }, + { 17370, true }, + { 17384, true }, + { 17400, true }, + { 17412, true }, + { 17424, true }, + { 17436, true }, + { 17448, true }, + { 17461, true }, { 17471, true }, - { 17482, true }, - { 17497, true }, - { 17510, true }, - { 17529, true }, - { 17541, true }, - { 17557, true }, - { 17569, true }, - { 17585, true }, - { 17604, true }, - { 17623, true }, - { 17636, true }, - { 17647, true }, - { 17658, true }, - { 17676, true }, - { 17706, true }, - { 17729, true }, - { 17742, false }, - { 17750, true }, - { 17762, true }, - { 17779, true }, - { 17789, true }, - { 17799, true }, + { 17480, true }, + { 17490, true }, + { 17505, true }, + { 17516, true }, + { 17531, true }, + { 17544, true }, + { 17563, true }, + { 17575, true }, + { 17591, true }, + { 17603, true }, + { 17619, true }, + { 17638, true }, + { 17657, true }, + { 17670, true }, + { 17681, true }, + { 17692, true }, + { 17710, true }, + { 17740, true }, + { 17763, true }, + { 17776, false }, + { 17784, true }, + { 17796, true }, { 17813, true }, - { 17829, true }, - { 17840, true }, - { 17869, true }, - { 17885, true }, - { 17901, true }, + { 17823, true }, + { 17833, true }, + { 17847, true }, + { 17863, true }, + { 17874, true }, + { 17903, true }, { 17919, true }, - { 17940, true }, - { 17952, true }, - { 17963, true }, - { 17975, true }, - { 17987, true }, - { 18005, true }, - { 18023, true }, - { 18044, true }, - { 18069, true }, - { 18087, true }, - { 18098, true }, - { 18123, true }, - { 18136, true }, - { 18151, true }, - { 18168, true }, - { 18196, true }, - { 18219, true }, - { 18234, true }, - { 18247, true }, - { 18260, true }, - { 18273, true }, - { 18286, true }, - { 18299, true }, - { 18312, true }, - { 18341, true }, - { 18352, true }, - { 18368, true }, - { 18378, true }, - { 18390, true }, + { 17935, true }, + { 17953, true }, + { 17974, true }, + { 17986, true }, + { 17997, true }, + { 18009, true }, + { 18027, true }, + { 18045, true }, + { 18066, true }, + { 18091, true }, + { 18109, true }, + { 18120, true }, + { 18145, true }, + { 18158, true }, + { 18173, true }, + { 18190, true }, + { 18218, true }, + { 18241, true }, + { 18256, true }, + { 18269, true }, + { 18282, true }, + { 18295, true }, + { 18308, true }, + { 18321, true }, + { 18334, true }, + { 18363, true }, + { 18374, true }, + { 18380, true }, + { 18396, true }, { 18406, true }, - { 18423, true }, - { 18435, true }, - { 18448, true }, - { 18456, true }, - { 18467, true }, - { 18478, true }, - { 18496, true }, - { 18508, true }, - { 18523, true }, - { 18532, true }, - { 18541, true }, - { 18555, true }, - { 18577, true }, - { 18591, true }, - { 18602, true }, - { 18610, true }, - { 18620, true }, - { 18632, true }, - { 18640, true }, - { 18650, true }, - { 18665, true }, - { 18673, true }, - { 18683, true }, - { 18708, true }, - { 18724, true }, - { 18734, true }, - { 18758, true }, - { 18765, true }, - { 18782, true }, - { 18790, true }, - { 18801, true }, - { 18808, true }, - { 18820, true }, - { 18831, true }, - { 18842, true }, - { 18854, true }, - { 18866, false }, - { 18875, true }, - { 18891, true }, - { 18904, true }, - { 18913, true }, - { 18934, true }, - { 18943, true }, - { 18958, true }, - { 18968, true }, - { 18980, true }, - { 18998, false }, - { 19014, true }, - { 19026, true }, - { 19037, true }, - { 19047, true }, - { 19057, true }, - { 19067, true }, - { 19079, true }, - { 19092, true }, - { 19105, true }, - { 19115, true }, - { 19129, true }, - { 19139, true }, - { 19147, true }, - { 19159, true }, - { 19171, true }, - { 19184, true }, - { 19200, true }, - { 19216, true }, - { 19227, false }, - { 19237, true }, - { 19254, true }, - { 19268, true }, - { 19298, true }, - { 19313, false }, - { 19322, true }, - { 19336, true }, + { 18418, true }, + { 18434, true }, + { 18451, true }, + { 18463, true }, + { 18476, true }, + { 18484, true }, + { 18495, true }, + { 18506, true }, + { 18524, true }, + { 18536, true }, + { 18551, true }, + { 18560, true }, + { 18569, true }, + { 18583, true }, + { 18605, true }, + { 18619, true }, + { 18630, true }, + { 18638, true }, + { 18648, true }, + { 18660, true }, + { 18668, true }, + { 18678, true }, + { 18693, true }, + { 18701, true }, + { 18711, true }, + { 18736, true }, + { 18752, true }, + { 18762, true }, + { 18786, true }, + { 18793, true }, + { 18810, true }, + { 18818, true }, + { 18829, true }, + { 18836, true }, + { 18848, true }, + { 18859, true }, + { 18870, true }, + { 18882, true }, + { 18894, false }, + { 18903, true }, + { 18919, true }, + { 18932, true }, + { 18941, true }, + { 18962, true }, + { 18971, true }, + { 18986, true }, + { 18996, true }, + { 19008, true }, + { 19026, false }, + { 19042, true }, + { 19054, true }, + { 19065, true }, + { 19075, true }, + { 19085, true }, + { 19095, true }, + { 19107, true }, + { 19120, true }, + { 19133, true }, + { 19143, true }, + { 19157, true }, + { 19167, true }, + { 19175, true }, + { 19187, true }, + { 19199, true }, + { 19212, true }, + { 19228, true }, + { 19244, true }, + { 19255, false }, + { 19265, true }, + { 19282, true }, + { 19296, true }, + { 19326, true }, + { 19341, false }, { 19350, true }, - { 19361, true }, - { 19373, true }, - { 19386, true }, - { 19410, true }, - { 19423, true }, - { 19435, true }, - { 19458, true }, - { 19469, true }, - { 19501, true }, - { 19521, true }, - { 19539, true }, - { 19557, true }, - { 19572, true }, - { 19587, true }, - { 19602, true }, - { 19623, true }, - { 19647, true }, - { 19657, true }, - { 19667, true }, - { 19677, true }, - { 19688, true }, - { 19713, true }, - { 19742, true }, - { 19755, true }, - { 19765, true }, - { 19773, true }, - { 19782, true }, - { 19796, false }, + { 19364, true }, + { 19378, true }, + { 19389, true }, + { 19401, true }, + { 19414, true }, + { 19438, true }, + { 19451, true }, + { 19463, true }, + { 19486, true }, + { 19497, true }, + { 19529, true }, + { 19549, true }, + { 19567, true }, + { 19585, true }, + { 19600, true }, + { 19615, true }, + { 19630, true }, + { 19651, true }, + { 19675, true }, + { 19685, true }, + { 19695, true }, + { 19705, true }, + { 19716, true }, + { 19741, true }, + { 19770, true }, + { 19783, true }, + { 19795, true }, + { 19805, true }, { 19813, true }, - { 19825, true }, - { 19840, true }, - { 19847, true }, - { 19860, true }, - { 19872, true }, - { 19896, true }, - { 19910, true }, - { 19918, true }, - { 19942, true }, - { 19957, true }, - { 19966, true }, - { 19979, true }, - { 19991, true }, - { 20002, true }, - { 20012, true }, - { 20027, true }, - { 20044, true }, - { 20057, true }, - { 20073, true }, - { 20083, true }, - { 20096, true }, - { 20110, true }, - { 20124, true }, + { 19822, true }, + { 19836, false }, + { 19853, true }, + { 19865, true }, + { 19880, true }, + { 19887, true }, + { 19900, true }, + { 19912, true }, + { 19936, true }, + { 19950, true }, + { 19958, true }, + { 19982, true }, + { 19997, true }, + { 20006, true }, + { 20019, true }, + { 20031, true }, + { 20042, true }, + { 20052, true }, + { 20067, true }, + { 20084, true }, + { 20097, true }, + { 20113, true }, + { 20123, true }, { 20136, true }, - { 20156, true }, - { 20171, true }, - { 20187, true }, - { 20201, true }, - { 20216, true }, - { 20228, true }, - { 20240, true }, - { 20252, true }, - { 20263, true }, - { 20274, true }, - { 20285, true }, - { 20308, true }, - { 20323, true }, - { 20338, false }, - { 20353, false }, - { 20369, true }, - { 20391, true }, + { 20150, true }, + { 20164, true }, + { 20176, true }, + { 20196, true }, + { 20211, true }, + { 20227, true }, + { 20241, true }, + { 20256, true }, + { 20268, true }, + { 20280, true }, + { 20292, true }, + { 20303, true }, + { 20314, true }, + { 20325, true }, + { 20348, true }, + { 20363, true }, + { 20378, false }, + { 20393, false }, { 20409, true }, - { 20426, true }, - { 20444, true }, - { 20455, true }, - { 20468, true }, - { 20485, true }, - { 20512, true }, - { 20528, true }, - { 20548, true }, - { 20563, true }, - { 20578, true }, - { 20592, true }, + { 20431, true }, + { 20449, true }, + { 20466, true }, + { 20484, true }, + { 20495, true }, + { 20508, true }, + { 20525, true }, + { 20552, true }, + { 20568, true }, + { 20588, true }, { 20603, true }, - { 20626, true }, - { 20638, true }, - { 20651, true }, - { 20664, true }, + { 20618, true }, + { 20632, true }, + { 20643, true }, + { 20666, true }, { 20678, true }, { 20691, true }, - { 20709, true }, - { 20727, true }, - { 20745, true }, - { 20762, true }, - { 20772, true }, + { 20704, true }, + { 20718, true }, + { 20731, true }, + { 20749, true }, + { 20767, true }, { 20785, true }, - { 20794, true }, - { 20805, false }, - { 20815, true }, - { 20826, true }, - { 20840, true }, - { 20853, true }, - { 20862, true }, - { 20872, true }, - { 20885, true }, - { 20899, true }, - { 20910, true }, - { 20920, true }, - { 20938, true }, - { 20958, true }, - { 20971, true }, - { 20980, true }, - { 21001, true }, - { 21018, true }, - { 21038, true }, - { 21057, true }, - { 21072, true }, - { 21085, true }, - { 21105, true }, - { 21123, true }, - { 21134, true }, - { 21147, true }, - { 21162, true }, - { 21172, true }, - { 21185, true }, - { 21196, true }, - { 21207, true }, - { 21221, true }, - { 21237, true }, + { 20802, true }, + { 20812, true }, + { 20825, true }, + { 20834, true }, + { 20845, false }, + { 20855, true }, + { 20866, true }, + { 20880, true }, + { 20893, true }, + { 20902, true }, + { 20912, true }, + { 20925, true }, + { 20939, true }, + { 20950, true }, + { 20960, true }, + { 20978, true }, + { 20998, true }, + { 21011, true }, + { 21020, true }, + { 21041, true }, + { 21058, true }, + { 21078, true }, + { 21097, true }, + { 21112, true }, + { 21125, true }, + { 21145, true }, + { 21163, true }, + { 21174, true }, + { 21187, true }, + { 21202, true }, + { 21212, true }, + { 21225, true }, + { 21236, true }, + { 21247, true }, { 21261, true }, - { 21287, true }, - { 21297, true }, - { 21319, true }, - { 21330, true }, - { 21341, true }, - { 21353, true }, - { 21380, true }, - { 21392, true }, - { 21404, true }, - { 21413, true }, - { 21422, true }, - { 21431, true }, - { 21450, true }, - { 21465, true }, - { 21476, true }, - { 21485, true }, - { 21495, true }, - { 21507, true }, - { 21516, true }, - { 21526, true }, - { 21544, true }, + { 21277, true }, + { 21301, true }, + { 21327, true }, + { 21337, true }, + { 21359, true }, + { 21370, true }, + { 21381, true }, + { 21393, true }, + { 21420, true }, + { 21432, true }, + { 21444, true }, + { 21453, true }, + { 21462, true }, + { 21471, true }, + { 21490, true }, + { 21505, true }, + { 21514, true }, + { 21524, true }, + { 21536, true }, + { 21545, true }, { 21555, true }, - { 21567, true }, - { 21578, true }, + { 21573, true }, + { 21584, true }, { 21596, true }, - { 21615, true }, - { 21628, true }, - { 21641, true }, - { 21651, true }, - { 21665, true }, - { 21675, true }, - { 21685, true }, - { 21698, true }, - { 21708, false }, - { 21719, true }, - { 21737, true }, - { 21747, true }, - { 21754, true }, + { 21607, true }, + { 21625, true }, + { 21644, true }, + { 21657, true }, + { 21670, true }, + { 21680, true }, + { 21694, true }, + { 21704, true }, + { 21714, true }, + { 21727, true }, + { 21737, false }, + { 21748, true }, { 21766, true }, - { 21787, true }, - { 21803, true }, + { 21776, true }, + { 21783, true }, + { 21795, true }, { 21816, true }, - { 21829, true }, - { 21846, true }, + { 21832, true }, + { 21845, true }, { 21858, true }, - { 21871, false }, - { 21885, true }, - { 21898, true }, - { 21909, true }, - { 21920, true }, - { 21932, true }, - { 21946, true }, - { 21964, true }, - { 21976, true }, - { 21993, true }, - { 22006, true }, - { 22017, true }, - { 22026, true }, - { 22044, true }, - { 22061, true }, - { 22072, true }, - { 22083, true }, - { 22108, true }, - { 22122, true }, - { 22135, true }, - { 22149, true }, - { 22162, true }, - { 22176, true }, - { 22191, true }, - { 22203, true }, - { 22219, false }, - { 22230, true }, - { 22245, true }, - { 22263, true }, - { 22276, true }, - { 22289, true }, - { 22305, true }, + { 21875, true }, + { 21887, true }, + { 21901, true }, + { 21914, false }, + { 21928, true }, + { 21941, true }, + { 21952, true }, + { 21963, true }, + { 21975, true }, + { 21989, true }, + { 22007, true }, + { 22019, true }, + { 22036, true }, + { 22049, true }, + { 22060, true }, + { 22069, true }, + { 22087, true }, + { 22104, true }, + { 22115, true }, + { 22126, true }, + { 22151, true }, + { 22165, true }, + { 22178, true }, + { 22192, true }, + { 22205, true }, + { 22219, true }, + { 22234, true }, + { 22246, true }, + { 22262, false }, + { 22273, true }, + { 22288, true }, + { 22306, true }, { 22319, true }, - { 22341, true }, - { 22353, true }, - { 22366, true }, - { 22381, true }, - { 22393, true }, + { 22332, true }, + { 22348, true }, + { 22362, true }, + { 22384, true }, + { 22396, true }, { 22409, true }, - { 22422, true }, - { 22447, true }, - { 22459, true }, - { 22469, true }, - { 22497, true }, + { 22424, true }, + { 22436, true }, + { 22452, true }, + { 22465, true }, + { 22490, true }, + { 22502, true }, { 22512, true }, - { 22528, true }, - { 22539, true }, - { 22550, true }, - { 22560, true }, - { 22573, true }, - { 22583, false }, - { 22597, true }, - { 22606, true }, - { 22618, true }, - { 22632, false }, - { 22651, true }, - { 22678, true }, - { 22699, true }, - { 22715, true }, - { 22726, true }, - { 22744, true }, - { 22759, true }, - { 22770, false }, - { 22785, true }, - { 22795, true }, - { 22806, true }, - { 22820, true }, - { 22842, true }, - { 22855, true }, - { 22870, true }, + { 22540, true }, + { 22555, true }, + { 22571, true }, + { 22582, true }, + { 22593, true }, + { 22603, true }, + { 22616, true }, + { 22626, false }, + { 22640, true }, + { 22649, true }, + { 22661, true }, + { 22675, false }, + { 22694, true }, + { 22721, true }, + { 22742, true }, + { 22758, true }, + { 22769, true }, + { 22787, true }, + { 22802, true }, + { 22813, false }, + { 22828, true }, + { 22838, true }, + { 22849, true }, + { 22863, true }, { 22885, true }, - { 22904, true }, - { 22925, true }, - { 22935, true }, - { 22949, true }, - { 22962, true }, - { 22977, true }, - { 22998, true }, - { 23018, true }, - { 23039, true }, - { 23057, true }, - { 23069, true }, - { 23087, true }, - { 23108, true }, - { 23128, true }, - { 23146, true }, - { 23160, true }, - { 23179, false }, - { 23193, true }, + { 22898, true }, + { 22913, true }, + { 22928, true }, + { 22947, true }, + { 22968, true }, + { 22978, true }, + { 22992, true }, + { 23005, true }, + { 23020, true }, + { 23041, true }, + { 23061, true }, + { 23082, true }, + { 23100, true }, + { 23112, true }, + { 23130, true }, + { 23151, true }, + { 23171, true }, + { 23189, true }, { 23203, true }, - { 23214, true }, - { 23224, true }, - { 23239, true }, - { 23252, true }, + { 23222, false }, + { 23236, true }, + { 23246, true }, + { 23257, true }, { 23267, true }, - { 23281, true }, - { 23294, true }, - { 23307, true }, - { 23321, true }, - { 23338, true }, - { 23348, true }, - { 23361, true }, - { 23378, true }, - { 23387, true }, - { 23401, true }, + { 23282, true }, + { 23295, true }, + { 23310, true }, + { 23324, true }, + { 23337, true }, + { 23350, true }, + { 23364, true }, + { 23381, true }, + { 23391, true }, + { 23404, true }, { 23421, true }, - { 23439, true }, - { 23459, true }, - { 23473, true }, - { 23489, true }, - { 23498, true }, - { 23508, true }, + { 23430, true }, + { 23444, true }, + { 23464, true }, + { 23482, true }, + { 23502, true }, { 23516, true }, - { 23525, true }, - { 23534, true }, + { 23532, true }, + { 23541, true }, { 23551, true }, - { 23564, true }, - { 23574, true }, - { 23584, true }, + { 23559, true }, + { 23568, true }, + { 23577, true }, { 23594, true }, - { 23612, true }, - { 23631, true }, + { 23607, true }, + { 23617, true }, + { 23627, true }, + { 23637, true }, { 23655, true }, - { 23675, true }, - { 23690, true }, - { 23705, true }, - { 23738, true }, - { 23756, true }, - { 23784, true }, - { 23800, true }, - { 23818, true }, - { 23841, true }, - { 23863, true }, - { 23889, true }, - { 23907, true }, - { 23929, true }, - { 23943, true }, - { 23963, true }, - { 23976, true }, - { 23988, true }, - { 24000, true }, - { 24014, true }, - { 24028, true }, - { 24046, true }, - { 24061, true }, - { 24073, true }, - { 24092, true }, - { 24114, true }, - { 24131, true }, - { 24146, true }, - { 24164, true }, - { 24178, true }, - { 24197, true }, - { 24218, true }, - { 24235, true }, - { 24249, true }, - { 24263, true }, - { 24284, true }, - { 24297, true }, + { 23674, true }, + { 23698, true }, + { 23718, true }, + { 23733, true }, + { 23748, true }, + { 23781, true }, + { 23799, true }, + { 23827, true }, + { 23843, true }, + { 23861, true }, + { 23884, true }, + { 23906, true }, + { 23932, true }, + { 23950, true }, + { 23972, true }, + { 23986, true }, + { 24006, true }, + { 24019, true }, + { 24031, true }, + { 24043, true }, + { 24057, true }, + { 24071, true }, + { 24089, true }, + { 24104, true }, + { 24116, true }, + { 24135, true }, + { 24157, true }, + { 24174, true }, + { 24189, true }, + { 24210, true }, + { 24228, true }, + { 24242, true }, + { 24261, true }, + { 24282, true }, + { 24299, true }, { 24313, true }, - { 24326, true }, - { 24345, true }, - { 24362, true }, - { 24380, true }, - { 24398, true }, - { 24407, true }, - { 24423, true }, - { 24430, true }, - { 24446, true }, - { 24465, true }, - { 24483, true }, - { 24499, true }, - { 24513, true }, - { 24525, true }, - { 24536, true }, - { 24550, true }, - { 24560, true }, - { 24569, false }, - { 24578, true }, - { 24592, true }, - { 24606, true }, - { 24618, true }, - { 24633, true }, - { 24641, true }, - { 24653, true }, - { 24668, true }, + { 24327, true }, + { 24348, true }, + { 24361, true }, + { 24377, true }, + { 24390, true }, + { 24409, true }, + { 24426, true }, + { 24444, true }, + { 24462, true }, + { 24471, true }, + { 24487, true }, + { 24494, true }, + { 24510, true }, + { 24529, true }, + { 24547, true }, + { 24563, true }, + { 24577, true }, + { 24589, true }, + { 24600, true }, + { 24614, true }, + { 24624, true }, + { 24633, false }, + { 24642, true }, + { 24656, true }, + { 24670, true }, { 24682, true }, - { 24695, true }, - { 24706, true }, - { 24714, true }, - { 24737, true }, - { 24749, true }, - { 24764, true }, - { 24780, true }, - { 24789, true }, - { 24804, true }, - { 24820, true }, - { 24833, true }, - { 24848, true }, - { 24861, true }, - { 24872, true }, - { 24882, true }, - { 24894, true }, - { 24914, true }, - { 24927, true }, + { 24697, true }, + { 24705, true }, + { 24717, true }, + { 24732, true }, + { 24746, true }, + { 24759, true }, + { 24770, true }, + { 24778, true }, + { 24801, true }, + { 24813, true }, + { 24828, true }, + { 24844, true }, + { 24853, true }, + { 24868, true }, + { 24884, true }, + { 24897, true }, + { 24912, true }, + { 24925, true }, + { 24936, true }, { 24946, true }, - { 24956, true }, - { 24964, true }, - { 24974, true }, - { 24995, true }, - { 25007, true }, - { 25022, true }, - { 25037, true }, - { 25052, true }, - { 25067, true }, - { 25077, true }, - { 25092, true }, - { 25108, true }, - { 25127, true }, - { 25148, true }, - { 25157, true }, - { 25186, true }, - { 25199, true }, - { 25219, true }, - { 25234, true }, - { 25245, true }, - { 25258, true }, - { 25273, true }, - { 25292, true }, - { 25307, true }, + { 24958, true }, + { 24978, true }, + { 24991, true }, + { 25010, true }, + { 25020, true }, + { 25028, true }, + { 25038, true }, + { 25059, true }, + { 25071, true }, + { 25086, true }, + { 25101, true }, + { 25116, true }, + { 25131, true }, + { 25141, true }, + { 25156, true }, + { 25172, true }, + { 25191, true }, + { 25212, true }, + { 25221, true }, + { 25250, true }, + { 25263, true }, + { 25283, true }, + { 25298, true }, + { 25309, true }, { 25322, true }, - { 25332, true }, - { 25342, true }, - { 25357, true }, - { 25379, true }, - { 25394, true }, - { 25407, true }, - { 25434, true }, - { 25448, true }, - { 25460, true }, - { 25475, true }, - { 25489, true }, - { 25499, true }, - { 25520, true }, - { 25528, true }, - { 25545, true }, - { 25567, true }, - { 25585, false }, - { 25604, true }, - { 25618, true }, - { 25630, true }, - { 25645, true }, - { 25662, true }, - { 25677, true }, - { 25688, true }, - { 25698, true }, - { 25714, true }, - { 25732, true }, - { 25744, true }, - { 25756, true }, - { 25786, false }, - { 25799, true }, - { 25816, true }, - { 25834, true }, - { 25847, true }, - { 25859, true }, - { 25882, true }, - { 25901, true }, - { 25914, true }, - { 25922, true }, - { 25934, false }, - { 25945, true }, - { 25963, true }, - { 25987, true }, - { 26007, true }, - { 26019, true }, - { 26040, true }, + { 25337, true }, + { 25356, true }, + { 25371, true }, + { 25386, true }, + { 25396, true }, + { 25406, true }, + { 25421, true }, + { 25443, true }, + { 25458, true }, + { 25471, true }, + { 25498, true }, + { 25512, true }, + { 25524, true }, + { 25539, true }, + { 25553, true }, + { 25563, true }, + { 25584, true }, + { 25592, true }, + { 25609, true }, + { 25631, true }, + { 25649, false }, + { 25668, true }, + { 25682, true }, + { 25694, true }, + { 25709, true }, + { 25726, true }, + { 25741, true }, + { 25752, true }, + { 25762, true }, + { 25778, true }, + { 25796, true }, + { 25808, true }, + { 25820, true }, + { 25850, false }, + { 25863, true }, + { 25880, true }, + { 25898, true }, + { 25911, true }, + { 25923, true }, + { 25946, true }, + { 25965, true }, + { 25978, true }, + { 25986, true }, + { 25998, false }, + { 26009, true }, + { 26027, true }, { 26051, true }, - { 26063, true }, - { 26080, true }, - { 26098, true }, - { 26111, true }, - { 26121, true }, - { 26135, true }, - { 26152, true }, - { 26163, true }, - { 26172, true }, - { 26184, true }, - { 26195, true }, - { 26205, true }, - { 26219, true }, - { 26232, true }, - { 26246, true }, - { 26264, true }, + { 26071, true }, + { 26083, true }, + { 26104, true }, + { 26115, true }, + { 26127, true }, + { 26144, true }, + { 26162, true }, + { 26175, true }, + { 26185, true }, + { 26199, true }, + { 26216, true }, + { 26227, true }, + { 26236, true }, + { 26248, true }, + { 26259, true }, + { 26269, true }, { 26283, true }, - { 26301, true }, - { 26314, true }, - { 26325, true }, - { 26339, true }, - { 26351, true }, - { 26362, true }, - { 26373, true }, - { 26386, true }, - { 26398, true }, - { 26409, true }, - { 26428, true }, - { 26444, true }, - { 26458, true }, + { 26296, true }, + { 26310, true }, + { 26328, true }, + { 26347, true }, + { 26365, true }, + { 26378, true }, + { 26389, true }, + { 26403, true }, + { 26415, true }, + { 26426, true }, + { 26437, true }, + { 26450, true }, + { 26462, true }, { 26473, true }, - { 26498, true }, - { 26510, true }, - { 26525, true }, - { 26534, true }, - { 26549, true }, - { 26563, true }, - { 26576, true }, - { 26588, true }, - { 26600, true }, - { 26614, true }, - { 26625, true }, - { 26639, true }, - { 26650, true }, - { 26661, true }, - { 26671, true }, - { 26685, true }, - { 26695, true }, - { 26708, true }, - { 26719, true }, - { 26730, true }, - { 26745, true }, - { 26758, true }, + { 26492, true }, + { 26508, true }, + { 26522, true }, + { 26537, true }, + { 26562, true }, + { 26574, true }, + { 26589, true }, + { 26598, true }, + { 26613, true }, + { 26627, true }, + { 26640, true }, + { 26652, true }, + { 26664, true }, + { 26678, true }, + { 26689, true }, + { 26703, true }, + { 26714, true }, + { 26725, true }, + { 26735, true }, + { 26749, true }, + { 26759, true }, { 26772, true }, - { 26784, true }, - { 26798, true }, - { 26810, true }, - { 26823, true }, + { 26783, true }, + { 26794, true }, + { 26809, true }, + { 26822, true }, + { 26836, true }, { 26848, true }, - { 26860, true }, - { 26877, true }, - { 26888, true }, - { 26899, true }, - { 26918, true }, - { 26934, true }, - { 26944, true }, - { 26958, true }, - { 26969, true }, - { 26981, true }, - { 26996, true }, - { 27015, true }, - { 27032, true }, - { 27040, true }, - { 27058, false }, - { 27066, true }, + { 26862, true }, + { 26874, true }, + { 26887, true }, + { 26912, true }, + { 26924, true }, + { 26941, true }, + { 26952, true }, + { 26963, true }, + { 26982, true }, + { 26998, true }, + { 27008, true }, + { 27022, true }, + { 27033, true }, + { 27045, true }, + { 27060, true }, { 27079, true }, - { 27091, true }, - { 27103, true }, - { 27117, true }, + { 27096, true }, + { 27104, true }, + { 27122, false }, { 27130, true }, { 27143, true }, - { 27159, true }, - { 27173, true }, - { 27190, true }, + { 27155, true }, + { 27167, true }, + { 27181, true }, + { 27194, true }, { 27207, true }, - { 27220, true }, - { 27233, true }, - { 27246, true }, - { 27259, true }, - { 27272, true }, - { 27285, true }, - { 27298, true }, - { 27311, true }, - { 27324, true }, - { 27337, true }, - { 27350, true }, - { 27363, true }, - { 27376, true }, - { 27389, true }, - { 27406, true }, - { 27425, true }, + { 27223, true }, + { 27237, true }, + { 27254, true }, + { 27271, true }, + { 27284, true }, + { 27297, true }, + { 27310, true }, + { 27323, true }, + { 27336, true }, + { 27349, true }, + { 27362, true }, + { 27375, true }, + { 27388, true }, + { 27401, true }, + { 27414, true }, + { 27427, true }, { 27440, true }, - { 27457, true }, + { 27453, true }, { 27470, true }, - { 27481, true }, - { 27493, true }, - { 27515, true }, - { 27527, true }, - { 27550, true }, - { 27574, true }, - { 27592, true }, - { 27605, true }, - { 27624, true }, - { 27640, true }, - { 27661, true }, - { 27672, true }, + { 27489, true }, + { 27504, true }, + { 27521, true }, + { 27534, true }, + { 27545, true }, + { 27557, true }, + { 27579, true }, + { 27591, true }, + { 27614, true }, + { 27638, true }, + { 27656, true }, + { 27669, true }, { 27688, true }, - { 27701, true }, - { 27716, true }, - { 27734, true }, - { 27750, true }, - { 27766, true }, - { 27776, true }, - { 27790, true }, - { 27805, true }, - { 27824, true }, - { 27836, true }, - { 27853, true }, + { 27704, true }, + { 27725, true }, + { 27736, true }, + { 27752, true }, + { 27765, true }, + { 27780, true }, + { 27798, true }, + { 27814, true }, + { 27830, true }, + { 27840, true }, + { 27854, true }, { 27869, true }, - { 27881, true }, - { 27891, true }, - { 27912, true }, - { 27926, true }, - { 27942, true }, - { 27964, true }, + { 27888, true }, + { 27900, true }, + { 27917, true }, + { 27933, true }, + { 27945, true }, + { 27955, true }, { 27976, true }, - { 27987, true }, - { 27998, true }, - { 28013, true }, + { 27990, true }, + { 28006, true }, { 28028, true }, { 28040, true }, - { 28059, true }, - { 28072, true }, - { 28086, true }, - { 28108, true }, - { 28127, true }, - { 28147, true }, - { 28161, true }, - { 28169, true }, - { 28182, true }, - { 28196, true }, - { 28207, true }, - { 28220, true }, - { 28235, true }, - { 28251, true }, - { 28266, true }, - { 28278, true }, - { 28292, true }, - { 28304, true }, - { 28316, true }, - { 28333, false }, - { 28349, false }, - { 28369, true }, - { 28382, true }, - { 28394, true }, - { 28407, true }, - { 28424, true }, - { 28440, true }, - { 28465, true }, - { 28478, true }, - { 28491, true }, - { 28502, true }, - { 28511, true }, - { 28520, true }, + { 28051, true }, + { 28062, true }, + { 28077, true }, + { 28092, true }, + { 28104, true }, + { 28123, true }, + { 28136, true }, + { 28150, true }, + { 28172, true }, + { 28191, true }, + { 28211, true }, + { 28225, true }, + { 28233, true }, + { 28246, true }, + { 28260, true }, + { 28271, true }, + { 28284, true }, + { 28299, true }, + { 28315, true }, + { 28330, true }, + { 28342, true }, + { 28356, true }, + { 28368, true }, + { 28380, true }, + { 28397, false }, + { 28413, false }, + { 28433, true }, + { 28446, true }, + { 28458, true }, + { 28471, true }, + { 28488, true }, + { 28504, true }, { 28529, true }, - { 28545, true }, - { 28559, true }, + { 28542, true }, + { 28555, true }, + { 28566, true }, { 28575, true }, - { 28586, true }, - { 28599, true }, - { 28614, true }, - { 28628, true }, - { 28640, true }, - { 28652, true }, - { 28676, true }, - { 28689, true }, - { 28703, true }, + { 28584, true }, + { 28593, true }, + { 28609, true }, + { 28623, true }, + { 28639, true }, + { 28650, true }, + { 28663, true }, + { 28678, true }, + { 28692, true }, + { 28704, true }, { 28716, true }, - { 28737, true }, - { 28757, true }, - { 28771, true }, - { 28786, true }, - { 28795, true }, - { 28806, true }, - { 28816, true }, - { 28826, true }, - { 28840, true }, - { 28857, true }, - { 28875, true }, - { 28900, true }, - { 28922, true }, - { 28935, true }, - { 28948, true }, - { 28959, true }, - { 28967, true }, + { 28740, true }, + { 28753, true }, + { 28767, true }, + { 28780, true }, + { 28801, true }, + { 28821, true }, + { 28835, true }, + { 28850, true }, + { 28859, true }, + { 28870, true }, + { 28880, true }, + { 28890, true }, + { 28904, true }, + { 28921, true }, + { 28939, true }, + { 28964, true }, { 28986, true }, - { 28996, true }, - { 29009, true }, - { 29026, true }, - { 29039, true }, - { 29052, true }, - { 29070, true }, - { 29087, true }, + { 28999, true }, + { 29012, true }, + { 29023, true }, + { 29031, true }, + { 29050, true }, + { 29060, true }, + { 29073, true }, + { 29090, true }, { 29103, true }, - { 29115, true }, - { 29127, true }, - { 29138, true }, - { 29152, true }, - { 29176, true }, + { 29116, true }, + { 29134, true }, + { 29151, true }, + { 29167, true }, + { 29179, true }, { 29191, true }, - { 29209, true }, - { 29224, true }, - { 29246, true }, - { 29256, true }, - { 29272, true }, - { 29283, true }, - { 29304, true }, - { 29317, true }, - { 29337, true }, - { 29348, true }, - { 29367, true }, - { 29379, true }, - { 29387, false }, - { 29399, true }, - { 29414, true }, + { 29202, true }, + { 29216, true }, + { 29240, true }, + { 29255, true }, + { 29273, true }, + { 29288, true }, + { 29310, true }, + { 29320, true }, + { 29336, true }, + { 29347, true }, + { 29368, true }, + { 29381, true }, + { 29401, true }, + { 29412, true }, { 29431, true }, { 29443, true }, - { 29462, true }, - { 29476, true }, - { 29504, true }, - { 29519, true }, - { 29534, true }, - { 29549, true }, - { 29564, true }, - { 29576, false }, - { 29585, true }, - { 29599, true }, - { 29611, true }, - { 29619, true }, - { 29634, true }, - { 29646, true }, - { 29658, true }, - { 29678, true }, - { 29694, true }, - { 29706, true }, - { 29724, true }, - { 29736, true }, - { 29750, true }, + { 29451, false }, + { 29463, true }, + { 29478, true }, + { 29495, true }, + { 29507, true }, + { 29526, true }, + { 29540, true }, + { 29568, true }, + { 29583, true }, + { 29598, true }, + { 29613, true }, + { 29628, true }, + { 29640, false }, + { 29649, true }, + { 29663, true }, + { 29675, true }, + { 29683, true }, + { 29698, true }, + { 29710, true }, + { 29722, true }, + { 29742, true }, + { 29758, true }, { 29770, true }, - { 29782, true }, - { 29796, true }, - { 29804, true }, - { 29821, true }, - { 29830, true }, - { 29856, true }, - { 29866, true }, - { 29878, false }, - { 29892, true }, - { 29908, true }, - { 29925, true }, - { 29937, true }, - { 29955, false }, - { 29977, false }, - { 30002, false }, - { 30026, true }, - { 30038, true }, - { 30048, true }, - { 30061, true }, - { 30071, true }, - { 30081, true }, - { 30091, true }, - { 30101, true }, - { 30111, true }, - { 30121, true }, - { 30131, true }, + { 29788, true }, + { 29800, true }, + { 29814, true }, + { 29834, true }, + { 29846, true }, + { 29860, true }, + { 29868, true }, + { 29885, true }, + { 29894, true }, + { 29920, true }, + { 29930, true }, + { 29942, false }, + { 29956, true }, + { 29972, true }, + { 29989, true }, + { 30001, true }, + { 30019, false }, + { 30041, false }, + { 30066, false }, + { 30090, true }, + { 30102, true }, + { 30112, true }, + { 30125, true }, + { 30135, true }, { 30145, true }, - { 30163, true }, - { 30178, true }, - { 30192, true }, - { 30210, true }, - { 30222, true }, - { 30234, true }, - { 30245, true }, - { 30259, true }, + { 30155, true }, + { 30165, true }, + { 30175, true }, + { 30185, true }, + { 30195, true }, + { 30209, true }, + { 30227, true }, + { 30242, true }, + { 30256, true }, { 30274, true }, - { 30288, true }, - { 30295, true }, - { 30309, false }, - { 30329, true }, - { 30350, true }, - { 30369, true }, - { 30384, true }, - { 30396, true }, - { 30421, true }, - { 30438, true }, - { 30449, true }, - { 30464, true }, - { 30475, true }, - { 30489, true }, - { 30501, true }, - { 30514, false }, - { 30527, true }, - { 30544, true }, - { 30560, true }, - { 30573, true }, - { 30585, true }, - { 30600, true }, - { 30610, true }, - { 30635, true }, - { 30649, true }, - { 30665, true }, - { 30679, true }, - { 30696, true }, - { 30715, true }, - { 30725, true }, - { 30745, true }, - { 30757, true }, - { 30773, true }, - { 30801, false }, - { 30813, true }, + { 30286, true }, + { 30298, true }, + { 30309, true }, + { 30323, true }, + { 30338, true }, + { 30352, true }, + { 30359, true }, + { 30373, false }, + { 30393, true }, + { 30414, true }, + { 30433, true }, + { 30448, true }, + { 30460, true }, + { 30485, true }, + { 30502, true }, + { 30517, true }, + { 30528, true }, + { 30542, true }, + { 30554, true }, + { 30567, false }, + { 30580, true }, + { 30597, true }, + { 30613, true }, + { 30626, true }, + { 30638, true }, + { 30653, true }, + { 30663, true }, + { 30688, true }, + { 30702, true }, + { 30718, true }, + { 30732, true }, + { 30749, true }, + { 30768, true }, + { 30778, true }, + { 30798, true }, + { 30810, true }, { 30826, true }, - { 30840, true }, - { 30857, true }, - { 30874, true }, - { 30883, true }, + { 30854, false }, + { 30866, true }, + { 30879, true }, { 30893, true }, { 30910, true }, - { 30919, true }, - { 30926, true }, + { 30927, true }, { 30936, true }, - { 30951, true }, - { 30962, false }, - { 30978, true }, - { 30995, true }, - { 31009, true }, - { 31019, true }, - { 31029, true }, - { 31049, true }, - { 31060, true }, - { 31075, true }, - { 31094, true }, - { 31112, true }, - { 31127, true }, - { 31140, true }, - { 31155, true }, - { 31171, true }, - { 31197, true }, - { 31214, true }, - { 31231, true }, - { 31244, true }, - { 31252, true }, - { 31275, true }, - { 31289, true }, - { 31299, true }, - { 31324, true }, - { 31341, false }, - { 31362, false }, - { 31384, false }, - { 31403, false }, - { 31421, true }, - { 31437, true }, - { 31461, true }, - { 31489, true }, - { 31500, true }, - { 31515, true }, - { 31539, true }, - { 31558, true }, - { 31581, true }, - { 31599, true }, - { 31623, true }, - { 31637, true }, - { 31648, true }, - { 31670, true }, - { 31688, true }, - { 31703, true }, - { 31718, true }, - { 31731, true }, - { 31744, true }, - { 31759, true }, - { 31774, true }, - { 31789, true }, - { 31816, true }, - { 31828, true }, - { 31843, true }, - { 31862, true }, - { 31880, true }, - { 31888, true }, + { 30946, true }, + { 30963, true }, + { 30972, true }, + { 30979, true }, + { 30989, true }, + { 31004, true }, + { 31015, false }, + { 31031, true }, + { 31048, true }, + { 31062, true }, + { 31072, true }, + { 31082, true }, + { 31102, true }, + { 31113, true }, + { 31128, true }, + { 31147, true }, + { 31165, true }, + { 31180, true }, + { 31193, true }, + { 31208, true }, + { 31224, true }, + { 31250, true }, + { 31267, true }, + { 31284, true }, + { 31297, true }, + { 31305, true }, + { 31328, true }, + { 31342, true }, + { 31352, true }, + { 31377, true }, + { 31394, false }, + { 31415, false }, + { 31437, false }, + { 31456, false }, + { 31474, true }, + { 31490, true }, + { 31514, true }, + { 31542, true }, + { 31553, true }, + { 31568, true }, + { 31592, true }, + { 31611, true }, + { 31634, true }, + { 31652, true }, + { 31676, true }, + { 31690, true }, + { 31701, true }, + { 31723, true }, + { 31741, true }, + { 31756, true }, + { 31771, true }, + { 31784, true }, + { 31797, true }, + { 31812, true }, + { 31827, true }, + { 31842, true }, + { 31869, true }, + { 31881, true }, { 31896, true }, - { 31905, true }, - { 31917, true }, - { 31929, true }, - { 31943, true }, - { 31961, true }, - { 31979, true }, - { 31994, true }, - { 32009, true }, - { 32018, true }, - { 32034, true }, - { 32051, true }, + { 31915, true }, + { 31933, true }, + { 31941, true }, + { 31949, true }, + { 31958, true }, + { 31970, true }, + { 31982, true }, + { 31996, true }, + { 32014, true }, + { 32032, true }, + { 32047, true }, { 32062, true }, - { 32075, true }, + { 32071, true }, { 32087, true }, - { 32097, true }, - { 32110, false }, + { 32104, true }, + { 32113, true }, { 32124, true }, - { 32140, true }, - { 32152, true }, - { 32162, true }, - { 32178, false }, - { 32185, true }, - { 32195, true }, - { 32209, true }, + { 32137, true }, + { 32149, true }, + { 32159, true }, + { 32172, false }, + { 32186, true }, + { 32202, true }, + { 32214, true }, { 32224, true }, - { 32232, true }, - { 32245, true }, - { 32253, true }, - { 32263, true }, - { 32281, true }, - { 32299, true }, - { 32310, true }, - { 32323, true }, - { 32336, true }, - { 32353, true }, - { 32367, true }, - { 32376, true }, - { 32391, true }, - { 32420, true }, - { 32437, true }, - { 32455, true }, - { 32465, true }, - { 32479, true }, - { 32491, true }, - { 32502, true }, - { 32529, true }, - { 32549, true }, - { 32566, true }, - { 32580, true }, - { 32602, true }, - { 32627, true }, - { 32640, true }, - { 32653, true }, - { 32670, true }, - { 32688, true }, - { 32703, true }, - { 32718, true }, - { 32729, true }, - { 32739, true }, - { 32760, true }, - { 32770, false }, - { 32789, true }, + { 32240, false }, + { 32247, true }, + { 32257, true }, + { 32271, true }, + { 32286, true }, + { 32294, true }, + { 32307, true }, + { 32315, true }, + { 32325, true }, + { 32343, true }, + { 32361, true }, + { 32372, true }, + { 32385, true }, + { 32398, true }, + { 32415, true }, + { 32429, true }, + { 32438, true }, + { 32453, true }, + { 32482, true }, + { 32499, true }, + { 32517, true }, + { 32527, true }, + { 32541, true }, + { 32553, true }, + { 32564, true }, + { 32591, true }, + { 32611, true }, + { 32628, true }, + { 32642, true }, + { 32664, true }, + { 32689, true }, + { 32702, true }, + { 32715, true }, + { 32732, true }, + { 32750, true }, + { 32765, true }, + { 32780, true }, + { 32791, true }, { 32801, true }, - { 32830, true }, - { 32848, true }, - { 32866, true }, - { 32884, true }, - { 32905, true }, - { 32919, true }, - { 32933, true }, - { 32941, true }, - { 32951, true }, - { 32964, true }, - { 32976, true }, - { 32988, true }, - { 33004, true }, - { 33018, true }, - { 33040, true }, - { 33059, true }, - { 33072, true }, - { 33085, true }, - { 33104, true }, - { 33119, true }, - { 33137, true }, - { 33148, true }, - { 33161, false }, - { 33171, true }, - { 33193, true }, - { 33207, true }, - { 33230, true }, + { 32822, true }, + { 32832, false }, + { 32851, true }, + { 32863, true }, + { 32892, true }, + { 32910, true }, + { 32928, true }, + { 32946, true }, + { 32967, true }, + { 32981, true }, + { 32995, true }, + { 33003, true }, + { 33013, true }, + { 33026, true }, + { 33038, true }, + { 33050, true }, + { 33066, true }, + { 33080, true }, + { 33102, true }, + { 33121, true }, + { 33134, true }, + { 33147, true }, + { 33166, true }, + { 33181, true }, + { 33194, true }, + { 33212, true }, + { 33223, true }, + { 33236, false }, { 33246, true }, - { 33261, true }, - { 33277, true }, - { 33294, true }, - { 33305, false }, - { 33313, true }, - { 33326, true }, - { 33341, true }, - { 33357, true }, - { 33377, true }, - { 33391, true }, - { 33399, true }, - { 33414, true }, - { 33427, true }, - { 33439, true }, - { 33450, true }, - { 33463, true }, - { 33483, false }, - { 33505, true }, - { 33529, true }, - { 33556, true }, - { 33576, true }, - { 33599, true }, - { 33617, true }, - { 33632, true }, - { 33659, true }, - { 33685, true }, - { 33712, true }, - { 33728, true }, - { 33746, true }, - { 33775, true }, + { 33268, true }, + { 33282, true }, + { 33305, true }, + { 33321, true }, + { 33336, true }, + { 33352, true }, + { 33369, true }, + { 33380, false }, + { 33388, true }, + { 33401, true }, + { 33416, true }, + { 33432, true }, + { 33452, true }, + { 33466, true }, + { 33474, true }, + { 33489, true }, + { 33502, true }, + { 33514, true }, + { 33525, true }, + { 33538, true }, + { 33558, false }, + { 33580, true }, + { 33604, true }, + { 33631, true }, + { 33651, true }, + { 33674, true }, + { 33692, true }, + { 33707, true }, + { 33734, true }, + { 33760, true }, { 33787, true }, { 33803, true }, - { 33814, true }, - { 33826, true }, - { 33839, true }, - { 33852, true }, - { 33863, true }, - { 33881, true }, - { 33894, true }, - { 33903, true }, - { 33920, true }, - { 33933, true }, - { 33942, true }, - { 33959, true }, - { 33967, true }, - { 33975, true }, - { 33984, true }, - { 33993, true }, + { 33821, true }, + { 33850, true }, + { 33862, true }, + { 33878, true }, + { 33889, true }, + { 33901, true }, + { 33914, true }, + { 33927, true }, + { 33938, true }, + { 33956, true }, + { 33969, true }, + { 33978, true }, + { 33995, true }, + { 34008, true }, { 34017, true }, - { 34027, true }, - { 34037, true }, - { 34046, true }, + { 34034, true }, + { 34042, true }, + { 34050, true }, { 34059, true }, - { 34072, true }, - { 34084, true }, - { 34098, true }, + { 34068, true }, + { 34092, true }, + { 34102, true }, { 34112, true }, - { 34130, true }, - { 34145, true }, + { 34121, true }, + { 34134, true }, + { 34147, true }, { 34159, true }, - { 34171, true }, + { 34173, true }, { 34187, true }, - { 34200, true }, - { 34215, true }, - { 34227, true }, - { 34242, true }, - { 34256, true }, - { 34265, true }, - { 34274, true }, - { 34288, true }, - { 34297, true }, - { 34311, true }, - { 34321, true }, - { 34334, true }, + { 34205, true }, + { 34220, true }, + { 34234, true }, + { 34246, true }, + { 34262, true }, + { 34275, true }, + { 34290, true }, + { 34302, true }, + { 34317, true }, + { 34331, true }, + { 34340, true }, { 34349, true }, - { 34362, true }, + { 34363, true }, { 34372, true }, - { 34385, true }, - { 34400, true }, - { 34415, true }, - { 34429, true }, - { 34444, true }, - { 34463, true }, - { 34477, true }, - { 34493, true }, - { 34508, true }, + { 34386, true }, + { 34396, true }, + { 34409, true }, + { 34424, true }, + { 34437, true }, + { 34447, true }, + { 34460, true }, + { 34475, true }, + { 34490, true }, + { 34504, true }, { 34519, true }, - { 34533, true }, - { 34543, true }, + { 34538, true }, { 34554, true }, - { 34570, true }, - { 34582, true }, - { 34598, true }, - { 34612, true }, - { 34617, true }, - { 34628, true }, - { 34636, true }, - { 34644, true }, - { 34651, true }, - { 34657, true }, - { 34667, true }, - { 34676, true }, - { 34686, true }, - { 34715, true }, - { 34730, false }, - { 34750, true }, - { 34760, true }, - { 34773, true }, - { 34791, true }, - { 34811, true }, - { 34827, true }, - { 34839, true }, - { 34851, true }, - { 34864, true }, - { 34875, true }, - { 34886, true }, - { 34898, true }, - { 34909, true }, - { 34923, true }, - { 34941, true }, - { 34957, true }, - { 34977, true }, - { 34987, true }, - { 35007, true }, - { 35015, true }, - { 35026, false }, - { 35036, true }, - { 35048, true }, + { 34568, true }, + { 34584, true }, + { 34599, true }, + { 34613, true }, + { 34623, true }, + { 34634, true }, + { 34650, true }, + { 34662, true }, + { 34678, true }, + { 34692, true }, + { 34697, true }, + { 34708, true }, + { 34716, true }, + { 34724, true }, + { 34731, true }, + { 34737, true }, + { 34747, true }, + { 34756, true }, + { 34766, true }, + { 34795, true }, + { 34810, false }, + { 34830, true }, + { 34840, true }, + { 34853, true }, + { 34871, true }, + { 34891, true }, + { 34907, true }, + { 34919, true }, + { 34931, true }, + { 34944, true }, + { 34955, true }, + { 34966, true }, + { 34978, true }, + { 34989, true }, + { 35003, true }, + { 35021, true }, + { 35037, true }, { 35057, true }, - { 35071, true }, - { 35085, true }, - { 35104, true }, - { 35112, true }, - { 35136, true }, - { 35155, true }, - { 35169, false }, - { 35185, true }, - { 35202, true }, - { 35213, true }, - { 35225, false }, - { 35240, true }, - { 35252, true }, - { 35271, true }, - { 35279, true }, - { 35291, true }, - { 35305, true }, - { 35317, true }, - { 35328, true }, - { 35342, true }, - { 35355, true }, - { 35367, true }, - { 35380, true }, - { 35400, true }, - { 35410, true }, - { 35429, true }, + { 35067, true }, + { 35087, true }, + { 35095, true }, + { 35106, false }, + { 35116, true }, + { 35128, true }, + { 35137, true }, + { 35151, true }, + { 35165, true }, + { 35184, true }, + { 35192, true }, + { 35216, true }, + { 35235, true }, + { 35249, false }, + { 35265, true }, + { 35282, true }, + { 35293, true }, + { 35305, false }, + { 35320, true }, + { 35332, true }, + { 35351, true }, + { 35359, true }, + { 35371, true }, + { 35385, true }, + { 35397, true }, + { 35408, true }, + { 35422, true }, + { 35435, true }, { 35447, true }, - { 35459, true }, - { 35470, true }, - { 35482, true }, - { 35499, true }, - { 35522, true }, - { 35545, true }, - { 35556, true }, - { 35568, true }, - { 35583, true }, - { 35594, true }, - { 35610, true }, - { 35626, true }, - { 35644, false }, - { 35667, true }, - { 35687, true }, - { 35702, true }, - { 35716, true }, - { 35731, true }, - { 35754, true }, - { 35773, true }, - { 35788, true }, - { 35806, true }, - { 35823, true }, - { 35849, true }, + { 35460, true }, + { 35480, true }, + { 35490, true }, + { 35509, true }, + { 35527, true }, + { 35539, true }, + { 35550, true }, + { 35562, true }, + { 35579, true }, + { 35602, true }, + { 35625, true }, + { 35636, true }, + { 35648, true }, + { 35663, true }, + { 35674, true }, + { 35690, true }, + { 35706, true }, + { 35724, false }, + { 35747, true }, + { 35767, true }, + { 35782, true }, + { 35796, true }, + { 35811, true }, + { 35834, true }, + { 35853, true }, { 35868, true }, - { 35884, true }, - { 35898, true }, - { 35919, true }, - { 35935, true }, - { 35960, true }, + { 35886, true }, + { 35903, true }, + { 35929, true }, + { 35948, true }, + { 35964, true }, { 35978, true }, - { 36004, true }, - { 36018, true }, - { 36036, true }, - { 36045, true }, - { 36057, true }, - { 36070, false }, - { 36081, true }, - { 36094, true }, - { 36106, true }, - { 36126, true }, - { 36141, true }, - { 36164, true }, - { 36177, true }, - { 36189, true }, - { 36201, true }, - { 36216, true }, - { 36229, true }, - { 36243, true }, - { 36253, true }, - { 36266, true }, - { 36274, true }, + { 35999, true }, + { 36015, true }, + { 36040, true }, + { 36058, true }, + { 36084, true }, + { 36098, true }, + { 36116, true }, + { 36125, true }, + { 36137, true }, + { 36150, false }, + { 36161, true }, + { 36174, true }, + { 36186, true }, + { 36206, true }, + { 36221, true }, + { 36244, true }, + { 36257, true }, + { 36269, true }, { 36281, true }, - { 36306, true }, - { 36332, true }, - { 36344, true }, - { 36365, true }, - { 36377, true }, - { 36392, true }, - { 36408, true }, - { 36434, true }, - { 36446, true }, - { 36468, true }, - { 36482, true }, - { 36502, true }, + { 36296, true }, + { 36309, true }, + { 36323, true }, + { 36333, true }, + { 36346, true }, + { 36354, true }, + { 36361, true }, + { 36386, true }, + { 36412, true }, + { 36424, true }, + { 36445, true }, + { 36457, true }, + { 36472, true }, + { 36488, true }, { 36514, true }, - { 36524, true }, - { 36537, true }, - { 36545, true }, - { 36559, true }, - { 36573, true }, - { 36597, true }, - { 36608, true }, + { 36526, true }, + { 36548, true }, + { 36562, true }, + { 36582, true }, + { 36594, true }, + { 36604, true }, + { 36617, true }, { 36625, true }, - { 36638, true }, - { 36647, true }, - { 36662, true }, - { 36684, true }, - { 36707, true }, - { 36731, true }, - { 36754, true }, - { 36767, true }, - { 36785, false }, - { 36816, false }, - { 36831, true }, - { 36844, true }, - { 36864, true }, - { 36879, true }, - { 36895, true }, - { 36906, true }, - { 36922, true }, - { 36933, true }, - { 36947, true }, - { 36957, false }, - { 36970, true }, - { 36987, true }, - { 37006, true }, - { 37020, true }, - { 37034, true }, - { 37046, true }, - { 37065, true }, - { 37082, true }, + { 36639, true }, + { 36653, true }, + { 36677, true }, + { 36688, true }, + { 36705, true }, + { 36718, true }, + { 36727, true }, + { 36742, true }, + { 36764, true }, + { 36787, true }, + { 36811, true }, + { 36834, true }, + { 36847, true }, + { 36865, false }, + { 36880, true }, + { 36893, true }, + { 36913, true }, + { 36928, true }, + { 36944, true }, + { 36955, true }, + { 36971, true }, + { 36982, true }, + { 36996, true }, + { 37006, false }, + { 37019, true }, + { 37036, true }, + { 37055, true }, + { 37069, true }, + { 37083, true }, { 37095, true }, - { 37112, true }, - { 37121, true }, - { 37141, true }, - { 37163, true }, - { 37176, true }, - { 37197, true }, - { 37208, true }, - { 37219, true }, - { 37231, true }, - { 37243, true }, - { 37254, true }, - { 37272, true }, - { 37286, true }, - { 37297, true }, - { 37313, true }, - { 37330, true }, - { 37339, true }, - { 37354, true }, - { 37368, true }, - { 37389, true }, - { 37406, true }, - { 37423, true }, - { 37439, true }, - { 37452, true }, - { 37465, true }, - { 37477, true }, - { 37490, true }, - { 37503, true }, - { 37516, true }, + { 37114, true }, + { 37131, true }, + { 37144, true }, + { 37161, true }, + { 37170, true }, + { 37190, true }, + { 37212, true }, + { 37225, true }, + { 37246, true }, + { 37257, true }, + { 37268, true }, + { 37280, true }, + { 37292, true }, + { 37303, true }, + { 37321, true }, + { 37335, true }, + { 37346, true }, + { 37362, true }, + { 37379, true }, + { 37388, true }, + { 37403, true }, + { 37417, true }, + { 37438, true }, + { 37455, true }, + { 37472, true }, + { 37488, true }, + { 37501, true }, + { 37514, true }, + { 37526, true }, { 37539, true }, - { 37551, true }, - { 37570, true }, - { 37585, true }, - { 37601, true }, - { 37622, true }, - { 37640, true }, - { 37651, true }, - { 37659, false }, - { 37682, true }, - { 37699, true }, - { 37716, true }, - { 37729, true }, - { 37746, true }, - { 37757, true }, - { 37769, false }, - { 37779, true }, - { 37795, false }, + { 37552, true }, + { 37565, true }, + { 37588, true }, + { 37600, true }, + { 37619, true }, + { 37634, true }, + { 37650, true }, + { 37671, true }, + { 37689, true }, + { 37700, true }, + { 37708, false }, + { 37731, true }, + { 37748, true }, + { 37765, true }, + { 37778, true }, + { 37795, true }, { 37806, true }, - { 37837, true }, - { 37874, true }, - { 37889, true }, - { 37898, true }, - { 37911, true }, - { 37945, true }, - { 37955, true }, - { 37973, true }, - { 37991, true }, - { 38002, true }, - { 38012, true }, - { 38023, true }, - { 38032, true }, - { 38044, true }, - { 38070, true }, - { 38087, true }, - { 38096, true }, - { 38112, true }, - { 38120, false }, - { 38128, true }, - { 38139, true }, - { 38149, true }, - { 38163, true }, - { 38176, true }, - { 38193, true }, - { 38203, true }, - { 38218, true }, - { 38232, true }, - { 38246, true }, - { 38259, true }, - { 38270, true }, - { 38280, true }, - { 38288, true }, - { 38302, true }, - { 38323, true }, + { 37818, false }, + { 37828, true }, + { 37844, false }, + { 37855, true }, + { 37886, true }, + { 37923, true }, + { 37938, true }, + { 37947, true }, + { 37960, true }, + { 37994, true }, + { 38004, true }, + { 38022, true }, + { 38040, true }, + { 38051, true }, + { 38061, true }, + { 38072, true }, + { 38081, true }, + { 38093, true }, + { 38119, true }, + { 38136, true }, + { 38145, true }, + { 38161, true }, + { 38169, false }, + { 38177, true }, + { 38188, true }, + { 38198, true }, + { 38212, true }, + { 38225, true }, + { 38242, true }, + { 38252, true }, + { 38267, true }, + { 38281, true }, + { 38295, true }, + { 38308, true }, + { 38319, true }, + { 38329, true }, { 38337, true }, - { 38353, true }, - { 38360, true }, - { 38370, true }, - { 38385, false }, - { 38395, true }, - { 38406, true }, - { 38425, false }, - { 38438, true }, - { 38458, true }, - { 38474, true }, - { 38492, true }, - { 38508, true }, - { 38519, true }, - { 38537, true }, - { 38547, true }, - { 38569, true }, - { 38589, false }, - { 38606, true }, + { 38351, true }, + { 38372, true }, + { 38386, true }, + { 38402, true }, + { 38409, true }, + { 38419, true }, + { 38434, false }, + { 38444, true }, + { 38455, true }, + { 38474, false }, + { 38487, true }, + { 38507, true }, + { 38523, true }, + { 38541, true }, + { 38557, true }, + { 38568, true }, + { 38586, true }, + { 38596, true }, { 38618, true }, - { 38630, true }, - { 38644, true }, - { 38660, true }, - { 38676, true }, - { 38692, true }, - { 38711, true }, - { 38728, true }, - { 38743, true }, - { 38762, true }, + { 38638, false }, + { 38655, true }, + { 38667, true }, + { 38679, true }, + { 38693, true }, + { 38709, true }, + { 38725, true }, + { 38741, true }, + { 38760, true }, { 38777, true }, { 38792, true }, - { 38813, true }, - { 38831, true }, - { 38850, true }, + { 38811, true }, + { 38826, true }, + { 38841, true }, { 38862, true }, - { 38875, true }, - { 38888, true }, - { 38902, true }, - { 38916, true }, - { 38927, true }, - { 38940, true }, - { 38959, true }, - { 38977, true }, - { 38991, true }, + { 38880, true }, + { 38899, true }, + { 38911, true }, + { 38924, true }, + { 38937, true }, + { 38951, true }, + { 38965, true }, + { 38976, true }, + { 38989, true }, { 39008, true }, - { 39023, true }, - { 39037, true }, - { 39051, true }, - { 39064, true }, - { 39074, true }, - { 39091, true }, - { 39107, true }, + { 39026, true }, + { 39040, true }, + { 39057, true }, + { 39072, true }, + { 39086, true }, + { 39100, true }, + { 39113, true }, { 39123, true }, - { 39138, true }, - { 39148, true }, - { 39163, true }, - { 39175, true }, - { 39186, true }, - { 39198, false }, - { 39206, true }, - { 39227, true }, + { 39140, true }, + { 39156, true }, + { 39172, true }, + { 39187, true }, + { 39197, true }, + { 39212, true }, + { 39224, true }, { 39235, true }, - { 39246, true }, - { 39259, true }, - { 39267, true }, - { 39275, true }, - { 39289, true }, - { 39303, true }, - { 39311, true }, - { 39319, true }, - { 39333, true }, - { 39353, true }, - { 39361, true }, - { 39370, false }, - { 39390, true }, - { 39408, true }, - { 39435, true }, - { 39453, true }, - { 39473, true }, - { 39485, true }, - { 39497, true }, - { 39513, true }, - { 39527, true }, - { 39544, true }, - { 39561, true }, - { 39579, true }, - { 39598, true }, - { 39619, true }, - { 39629, true }, - { 39642, true }, - { 39659, true }, - { 39672, true }, - { 39686, true }, - { 39699, true }, - { 39713, true }, - { 39732, true }, - { 39742, true }, - { 39762, true }, - { 39771, true }, + { 39247, false }, + { 39255, true }, + { 39276, true }, + { 39284, true }, + { 39295, true }, + { 39308, true }, + { 39316, true }, + { 39324, true }, + { 39338, true }, + { 39352, true }, + { 39360, true }, + { 39368, true }, + { 39382, true }, + { 39402, true }, + { 39410, true }, + { 39419, false }, + { 39439, true }, + { 39457, true }, + { 39484, true }, + { 39495, true }, + { 39513, false }, + { 39531, true }, + { 39551, true }, + { 39563, true }, + { 39575, true }, + { 39591, true }, + { 39605, true }, + { 39622, true }, + { 39639, true }, + { 39657, true }, + { 39676, true }, + { 39697, true }, + { 39707, true }, + { 39720, true }, + { 39737, true }, + { 39750, true }, + { 39764, true }, + { 39777, true }, { 39791, true }, - { 39808, true }, - { 39828, true }, - { 39842, true }, - { 39862, true }, - { 39880, true }, - { 39900, true }, - { 39935, true }, - { 39949, true }, - { 39967, true }, - { 39977, true }, - { 40007, true }, - { 40022, true }, - { 40034, true }, - { 40047, true }, - { 40063, true }, - { 40076, true }, - { 40105, true }, - { 40119, true }, - { 40134, true }, + { 39810, true }, + { 39820, true }, + { 39840, true }, + { 39849, true }, + { 39869, true }, + { 39886, true }, + { 39906, true }, + { 39920, true }, + { 39940, true }, + { 39958, true }, + { 39978, true }, + { 40013, true }, + { 40027, true }, + { 40045, true }, + { 40055, true }, + { 40085, true }, + { 40100, true }, + { 40112, true }, + { 40125, true }, + { 40141, true }, { 40154, true }, - { 40168, true }, - { 40182, true }, - { 40199, true }, - { 40216, true }, + { 40183, true }, + { 40197, true }, + { 40212, true }, { 40232, true }, - { 40247, true }, - { 40257, false }, - { 40268, true }, - { 40276, true }, - { 40284, true }, + { 40246, true }, + { 40260, true }, + { 40277, true }, + { 40294, true }, { 40305, true }, - { 40326, true }, - { 40347, false }, - { 40363, true }, - { 40376, true }, - { 40391, true }, - { 40403, false }, - { 40424, true }, - { 40444, true }, - { 40466, true }, + { 40321, true }, + { 40336, true }, + { 40346, false }, + { 40357, true }, + { 40365, true }, + { 40373, true }, + { 40394, true }, + { 40415, true }, + { 40436, false }, + { 40452, true }, + { 40465, true }, { 40480, true }, - { 40498, true }, - { 40518, true }, - { 40534, true }, - { 40548, true }, - { 40564, true }, - { 40582, true }, - { 40597, true }, - { 40608, true }, - { 40619, true }, - { 40632, true }, - { 40645, true }, - { 40659, true }, - { 40674, true }, - { 40691, true }, - { 40706, true }, - { 40725, true }, - { 40741, true }, - { 40753, true }, + { 40492, false }, + { 40513, true }, + { 40533, true }, + { 40555, true }, + { 40569, true }, + { 40587, true }, + { 40607, true }, + { 40623, true }, + { 40637, true }, + { 40653, true }, + { 40671, true }, + { 40686, true }, + { 40697, true }, + { 40708, true }, + { 40721, true }, + { 40734, true }, + { 40748, true }, { 40763, true }, - { 40774, false }, - { 40796, true }, - { 40804, true }, - { 40820, true }, - { 40835, true }, - { 40845, true }, - { 40862, true }, - { 40876, true }, - { 40891, true }, + { 40780, true }, + { 40795, true }, + { 40814, true }, + { 40830, true }, + { 40842, true }, + { 40852, true }, + { 40863, false }, + { 40885, true }, + { 40893, true }, { 40909, true }, - { 40921, true }, - { 40932, true }, - { 40958, true }, - { 40982, true }, + { 40924, true }, + { 40934, true }, + { 40951, true }, + { 40965, true }, + { 40980, true }, { 40998, true }, - { 41007, true }, - { 41023, true }, - { 41038, true }, - { 41059, true }, - { 41068, true }, - { 41083, true }, - { 41096, false }, - { 41106, true }, - { 41125, true }, - { 41139, true }, - { 41159, true }, - { 41174, true }, - { 41183, true }, - { 41201, true }, - { 41223, false }, - { 41245, true }, - { 41254, true }, - { 41273, true }, - { 41285, false }, - { 41301, true }, - { 41325, false }, - { 41339, true }, - { 41355, true }, - { 41374, true }, - { 41386, true }, - { 41401, true }, - { 41419, true }, - { 41434, true }, - { 41446, true }, - { 41464, true }, - { 41484, true }, - { 41506, true }, - { 41524, true }, - { 41534, true }, - { 41545, true }, - { 41562, true }, - { 41577, true }, - { 41594, true }, - { 41609, true }, - { 41626, true }, - { 41640, true }, - { 41654, true }, - { 41673, true }, - { 41690, true }, - { 41707, true }, - { 41726, true }, - { 41741, true }, - { 41768, true }, - { 41788, true }, - { 41810, true }, - { 41831, true }, - { 41854, true }, - { 41874, true }, - { 41892, true }, - { 41910, true }, - { 41929, true }, - { 41951, true }, - { 41970, true }, - { 41990, true }, - { 42007, true }, - { 42034, true }, - { 42054, true }, - { 42077, true }, - { 42100, true }, - { 42114, true }, - { 42131, true }, - { 42147, true }, - { 42161, true }, - { 42175, true }, - { 42188, true }, - { 42225, false }, + { 41010, true }, + { 41021, true }, + { 41047, true }, + { 41071, true }, + { 41087, true }, + { 41096, true }, + { 41112, true }, + { 41127, true }, + { 41148, true }, + { 41157, true }, + { 41172, true }, + { 41185, false }, + { 41195, true }, + { 41214, true }, + { 41228, true }, + { 41248, true }, + { 41263, true }, + { 41272, true }, + { 41290, true }, + { 41312, false }, + { 41334, true }, + { 41343, true }, + { 41362, true }, + { 41374, false }, + { 41390, true }, + { 41414, false }, + { 41428, true }, + { 41444, true }, + { 41463, true }, + { 41475, true }, + { 41490, true }, + { 41508, true }, + { 41523, true }, + { 41535, true }, + { 41553, true }, + { 41573, true }, + { 41595, true }, + { 41613, true }, + { 41623, true }, + { 41634, true }, + { 41651, true }, + { 41666, true }, + { 41683, true }, + { 41698, true }, + { 41715, true }, + { 41729, true }, + { 41743, true }, + { 41762, true }, + { 41779, true }, + { 41796, true }, + { 41815, true }, + { 41830, true }, + { 41857, true }, + { 41877, true }, + { 41899, true }, + { 41920, true }, + { 41943, true }, + { 41963, true }, + { 41981, true }, + { 41999, true }, + { 42018, true }, + { 42040, true }, + { 42059, true }, + { 42079, true }, + { 42096, true }, + { 42123, true }, + { 42143, true }, + { 42166, true }, + { 42189, true }, + { 42203, true }, + { 42220, true }, { 42236, true }, - { 42254, true }, - { 42274, true }, - { 42297, true }, - { 42322, false }, - { 42353, true }, - { 42367, true }, - { 42381, true }, - { 42392, true }, - { 42401, true }, - { 42412, true }, - { 42424, true }, - { 42440, true }, - { 42452, true }, - { 42461, true }, - { 42473, true }, + { 42250, true }, + { 42264, true }, + { 42277, true }, + { 42314, false }, + { 42325, true }, + { 42343, true }, + { 42363, true }, + { 42386, true }, + { 42411, false }, + { 42442, true }, + { 42456, true }, + { 42470, true }, + { 42481, true }, { 42490, true }, - { 42500, true }, - { 42514, true }, - { 42532, false }, - { 42540, true }, - { 42551, true }, - { 42565, true }, - { 42584, true }, - { 42595, false }, - { 42613, true }, - { 42626, true }, - { 42639, true }, - { 42656, true }, - { 42670, true }, - { 42686, true }, - { 42697, true }, - { 42711, true }, - { 42724, true }, - { 42742, true }, - { 42754, true }, - { 42769, true }, - { 42777, true }, - { 42797, true }, - { 42811, true }, - { 42823, true }, - { 42835, true }, - { 42847, true }, - { 42857, true }, - { 42868, true }, - { 42882, true }, - { 42893, true }, - { 42907, true }, - { 42930, true }, - { 42938, true }, - { 42956, true }, + { 42501, true }, + { 42513, true }, + { 42529, true }, + { 42541, true }, + { 42550, true }, + { 42562, true }, + { 42579, true }, + { 42589, true }, + { 42603, true }, + { 42621, false }, + { 42629, true }, + { 42640, true }, + { 42654, true }, + { 42673, true }, + { 42684, false }, + { 42702, true }, + { 42715, true }, + { 42728, true }, + { 42745, true }, + { 42759, true }, + { 42775, true }, + { 42786, true }, + { 42800, true }, + { 42813, true }, + { 42831, true }, + { 42843, true }, + { 42858, true }, + { 42866, true }, + { 42886, true }, + { 42900, true }, + { 42912, true }, + { 42924, true }, + { 42936, true }, + { 42946, true }, + { 42957, true }, { 42971, true }, - { 42990, false }, - { 43009, true }, - { 43028, true }, - { 43041, true }, - { 43053, true }, - { 43069, true }, - { 43079, true }, + { 42982, true }, + { 42996, true }, + { 43019, true }, + { 43027, true }, + { 43045, true }, + { 43060, true }, + { 43079, false }, { 43098, true }, - { 43112, true }, - { 43125, true }, - { 43140, true }, - { 43148, true }, - { 43162, true }, - { 43177, true }, - { 43189, true }, - { 43197, true }, - { 43203, true }, - { 43216, true }, - { 43225, true }, - { 43239, true }, - { 43253, true }, - { 43266, false }, - { 43286, true }, - { 43302, true }, - { 43313, true }, - { 43325, true }, - { 43341, true }, - { 43354, true }, - { 43374, true }, - { 43388, true }, - { 43404, true }, - { 43418, true }, - { 43438, true }, - { 43452, true }, - { 43467, true }, - { 43487, true }, - { 43501, true }, - { 43514, true }, - { 43523, true }, - { 43539, true }, - { 43561, true }, - { 43593, true }, - { 43601, true }, - { 43619, true }, - { 43635, true }, - { 43656, true }, - { 43676, true }, - { 43689, true }, - { 43704, true }, - { 43724, true }, - { 43738, true }, - { 43757, true }, - { 43776, true }, - { 43790, true }, - { 43805, true }, - { 43818, true }, - { 43831, true }, - { 43846, true }, - { 43858, true }, - { 43873, true }, + { 43117, true }, + { 43130, true }, + { 43142, true }, + { 43158, true }, + { 43168, true }, + { 43187, true }, + { 43201, true }, + { 43214, true }, + { 43229, true }, + { 43243, true }, + { 43258, true }, + { 43270, true }, + { 43278, true }, + { 43284, true }, + { 43297, true }, + { 43306, true }, + { 43320, true }, + { 43334, true }, + { 43347, false }, + { 43367, true }, + { 43383, true }, + { 43394, true }, + { 43406, true }, + { 43422, true }, + { 43435, true }, + { 43455, true }, + { 43469, true }, + { 43485, true }, + { 43499, true }, + { 43519, true }, + { 43533, true }, + { 43548, true }, + { 43568, true }, + { 43582, true }, + { 43595, true }, + { 43604, true }, + { 43614, true }, + { 43630, true }, + { 43652, true }, + { 43684, true }, + { 43692, true }, + { 43710, true }, + { 43726, true }, + { 43747, true }, + { 43767, true }, + { 43780, true }, + { 43795, true }, + { 43815, true }, + { 43829, true }, + { 43848, true }, + { 43867, true }, + { 43881, true }, { 43896, true }, - { 43912, true }, - { 43935, true }, - { 43954, true }, - { 43966, false }, + { 43909, true }, + { 43922, true }, + { 43937, true }, + { 43949, true }, + { 43964, true }, { 43987, true }, - { 44006, false }, - { 44014, true }, - { 44023, true }, - { 44036, true }, - { 44050, true }, - { 44059, true }, - { 44071, true }, - { 44087, true }, - { 44104, false }, + { 44003, true }, + { 44026, true }, + { 44045, true }, + { 44057, false }, + { 44078, true }, + { 44097, false }, + { 44105, true }, { 44114, true }, - { 44125, true }, - { 44137, true }, - { 44153, true }, - { 44166, true }, - { 44185, true }, - { 44204, true }, - { 44222, true }, - { 44239, true }, - { 44256, false }, - { 44266, true }, - { 44284, true }, - { 44300, true }, - { 44319, true }, - { 44335, true }, - { 44349, true }, - { 44366, true }, - { 44388, true }, - { 44400, true }, - { 44413, true }, - { 44434, true }, - { 44456, true }, - { 44473, true }, - { 44495, true }, - { 44511, true }, - { 44526, true }, - { 44540, true }, - { 44566, true }, - { 44582, true }, - { 44607, true }, - { 44622, true }, - { 44635, true }, - { 44647, true }, - { 44664, true }, - { 44674, true }, - { 44689, true }, - { 44699, true }, - { 44708, true }, - { 44722, true }, - { 44733, true }, - { 44744, true }, - { 44760, true }, - { 44775, true }, - { 44787, true }, - { 44801, true }, - { 44814, true }, - { 44825, true }, - { 44841, true }, - { 44851, true }, - { 44860, true }, - { 44872, true }, - { 44885, true }, - { 44896, true }, - { 44905, true }, - { 44913, true }, + { 44127, true }, + { 44141, true }, + { 44150, true }, + { 44162, true }, + { 44178, true }, + { 44195, false }, + { 44205, true }, + { 44216, true }, + { 44228, true }, + { 44244, true }, + { 44257, true }, + { 44276, true }, + { 44295, true }, + { 44313, true }, + { 44330, true }, + { 44347, false }, + { 44357, true }, + { 44375, true }, + { 44391, true }, + { 44410, true }, + { 44426, true }, + { 44440, true }, + { 44457, true }, + { 44479, true }, + { 44491, true }, + { 44512, true }, + { 44534, true }, + { 44551, true }, + { 44573, true }, + { 44589, true }, + { 44604, true }, + { 44618, true }, + { 44644, true }, + { 44660, true }, + { 44685, true }, + { 44700, true }, + { 44713, true }, + { 44725, true }, + { 44742, true }, + { 44752, true }, + { 44767, true }, + { 44777, true }, + { 44786, true }, + { 44800, true }, + { 44811, true }, + { 44822, true }, + { 44838, true }, + { 44853, true }, + { 44865, true }, + { 44879, true }, + { 44892, true }, + { 44903, true }, + { 44919, true }, { 44929, true }, - { 44937, true }, - { 44947, true }, - { 44958, true }, - { 44969, true }, - { 44983, false }, - { 45003, true }, - { 45023, true }, + { 44938, true }, + { 44950, true }, + { 44963, true }, + { 44974, true }, + { 44983, true }, + { 44991, true }, + { 45007, true }, + { 45015, true }, + { 45025, true }, + { 45036, true }, { 45047, true }, - { 45068, true }, - { 45076, true }, - { 45097, true }, - { 45107, true }, - { 45121, true }, - { 45141, true }, - { 45154, false }, - { 45164, true }, - { 45194, true }, - { 45221, false }, - { 45235, true }, - { 45251, true }, - { 45264, true }, - { 45283, true }, - { 45295, true }, - { 45312, true }, - { 45326, false }, - { 45344, true }, - { 45352, true }, - { 45368, true }, - { 45379, true }, - { 45394, true }, - { 45407, true }, - { 45420, true }, - { 45435, true }, - { 45455, false }, - { 45470, true }, - { 45482, true }, - { 45494, true }, - { 45506, true }, - { 45519, true }, - { 45534, true }, - { 45547, true }, + { 45061, false }, + { 45081, true }, + { 45101, true }, + { 45125, true }, + { 45146, true }, + { 45154, true }, + { 45175, true }, + { 45185, true }, + { 45199, true }, + { 45219, true }, + { 45232, false }, + { 45242, true }, + { 45272, true }, + { 45299, false }, + { 45313, true }, + { 45329, true }, + { 45342, true }, + { 45361, true }, + { 45373, true }, + { 45390, true }, + { 45404, false }, + { 45422, true }, + { 45430, true }, + { 45446, true }, + { 45457, true }, + { 45472, true }, + { 45485, true }, + { 45498, true }, + { 45513, true }, + { 45533, false }, + { 45548, true }, { 45560, true }, - { 45573, true }, - { 45588, false }, - { 45611, false }, - { 45635, true }, - { 45652, true }, - { 45665, true }, - { 45676, true }, - { 45688, true }, - { 45702, true }, - { 45720, true }, + { 45572, true }, + { 45584, true }, + { 45597, true }, + { 45612, true }, + { 45625, true }, + { 45638, true }, + { 45653, false }, + { 45676, false }, + { 45700, true }, + { 45717, true }, { 45730, true }, { 45741, true }, - { 45760, true }, - { 45777, true }, - { 45799, true }, - { 45813, true }, - { 45826, true }, - { 45845, true }, - { 45855, true }, - { 45869, true }, - { 45902, true }, - { 45923, true }, - { 45935, true }, - { 45949, true }, - { 45960, true }, - { 45974, true }, - { 45987, true }, - { 46003, true }, - { 46016, true }, - { 46036, true }, - { 46053, true }, - { 46064, true }, - { 46072, true }, - { 46085, true }, - { 46097, false }, - { 46109, true }, - { 46120, true }, - { 46142, true }, - { 46155, true }, - { 46175, true }, - { 46187, true }, - { 46199, true }, - { 46216, true }, + { 45753, true }, + { 45765, true }, + { 45779, true }, + { 45797, true }, + { 45807, true }, + { 45818, true }, + { 45837, true }, + { 45854, true }, + { 45876, true }, + { 45890, true }, + { 45903, true }, + { 45922, true }, + { 45932, true }, + { 45946, true }, + { 45979, true }, + { 46000, true }, + { 46012, true }, + { 46027, true }, + { 46041, true }, + { 46052, true }, + { 46066, true }, + { 46079, true }, + { 46095, true }, + { 46108, true }, + { 46128, true }, + { 46145, true }, + { 46156, true }, + { 46164, true }, + { 46177, true }, + { 46189, false }, + { 46201, true }, + { 46212, true }, { 46234, true }, - { 46248, true }, - { 46263, false }, - { 46278, true }, - { 46297, true }, - { 46312, true }, + { 46247, true }, + { 46267, true }, + { 46279, true }, + { 46291, true }, + { 46308, true }, { 46326, true }, - { 46338, true }, - { 46349, true }, - { 46365, true }, - { 46381, true }, - { 46402, true }, - { 46421, false }, - { 46438, true }, - { 46465, true }, - { 46484, true }, - { 46504, true }, - { 46518, true }, - { 46535, true }, - { 46555, true }, + { 46340, true }, + { 46355, false }, + { 46370, true }, + { 46389, true }, + { 46404, true }, + { 46418, true }, + { 46430, true }, + { 46441, true }, + { 46457, true }, + { 46473, true }, + { 46494, true }, + { 46513, false }, + { 46530, true }, + { 46541, true }, { 46568, true }, - { 46582, true }, - { 46603, true }, - { 46624, true }, - { 46637, true }, - { 46644, true }, - { 46656, true }, - { 46678, true }, - { 46694, true }, - { 46710, true }, - { 46725, true }, - { 46738, true }, - { 46758, true }, - { 46772, true }, - { 46787, true }, + { 46587, true }, + { 46607, true }, + { 46621, true }, + { 46638, true }, + { 46658, true }, + { 46671, true }, + { 46685, true }, + { 46706, true }, + { 46727, true }, + { 46740, true }, + { 46747, true }, + { 46759, true }, + { 46781, true }, { 46797, true }, { 46813, true }, - { 46824, true }, - { 46834, true }, - { 46846, true }, - { 46858, true }, - { 46876, true }, - { 46895, true }, - { 46910, true }, - { 46931, false }, - { 46952, true }, - { 46962, true }, - { 46980, true }, - { 46994, true }, - { 47014, true }, - { 47034, true }, - { 47066, true }, - { 47076, true }, - { 47095, true }, - { 47112, false }, - { 47136, false }, - { 47158, true }, - { 47182, true }, - { 47212, true }, - { 47236, true }, - { 47252, true }, - { 47269, true }, - { 47281, true }, - { 47299, true }, - { 47314, true }, - { 47343, true }, - { 47360, true }, - { 47374, true }, - { 47396, true }, - { 47421, true }, - { 47434, true }, - { 47447, true }, - { 47462, true }, - { 47484, true }, - { 47500, true }, + { 46828, true }, + { 46841, true }, + { 46861, true }, + { 46875, true }, + { 46890, true }, + { 46900, true }, + { 46916, true }, + { 46927, true }, + { 46937, true }, + { 46949, true }, + { 46961, true }, + { 46979, true }, + { 46998, true }, + { 47013, true }, + { 47034, false }, + { 47055, true }, + { 47065, true }, + { 47083, true }, + { 47097, true }, + { 47117, true }, + { 47137, true }, + { 47169, true }, + { 47179, true }, + { 47198, true }, + { 47215, false }, + { 47239, false }, + { 47261, true }, + { 47285, true }, + { 47315, true }, + { 47339, true }, + { 47355, true }, + { 47372, true }, + { 47384, true }, + { 47402, true }, + { 47417, true }, + { 47446, true }, + { 47463, true }, + { 47477, true }, + { 47499, true }, { 47524, true }, - { 47548, true }, - { 47562, true }, - { 47577, true }, - { 47596, true }, - { 47612, true }, - { 47631, true }, - { 47648, true }, - { 47666, true }, - { 47690, false }, - { 47712, true }, - { 47725, true }, - { 47736, true }, - { 47748, true }, - { 47770, true }, - { 47780, true }, - { 47794, true }, - { 47812, true }, - { 47825, true }, - { 47844, true }, - { 47859, true }, - { 47874, true }, + { 47537, true }, + { 47550, true }, + { 47565, true }, + { 47587, true }, + { 47603, true }, + { 47627, true }, + { 47651, true }, + { 47665, true }, + { 47680, true }, + { 47699, true }, + { 47715, true }, + { 47734, true }, + { 47751, true }, + { 47769, true }, + { 47793, false }, + { 47815, true }, + { 47828, true }, + { 47839, true }, + { 47851, true }, + { 47873, true }, + { 47883, true }, { 47897, true }, - { 47910, true }, - { 47921, true }, - { 47934, true }, - { 47945, true }, - { 47964, true }, - { 47982, true }, - { 48004, true }, - { 48029, true }, - { 48052, true }, - { 48072, true }, - { 48086, true }, - { 48099, true }, - { 48112, true }, - { 48130, true }, - { 48140, true }, - { 48153, true }, - { 48180, true }, - { 48198, true }, - { 48219, true }, - { 48234, true }, - { 48252, true }, - { 48277, true }, - { 48292, false }, - { 48315, false }, - { 48324, true }, - { 48345, true }, - { 48362, true }, - { 48373, true }, - { 48386, true }, - { 48399, false }, - { 48438, true }, - { 48449, true }, - { 48462, true }, - { 48474, true }, - { 48490, true }, - { 48504, false }, - { 48519, true }, - { 48539, false }, - { 48555, true }, - { 48574, true }, - { 48585, true }, - { 48598, true }, - { 48610, true }, + { 47915, true }, + { 47928, true }, + { 47947, true }, + { 47962, true }, + { 47977, true }, + { 48000, true }, + { 48013, true }, + { 48024, true }, + { 48037, true }, + { 48048, true }, + { 48067, true }, + { 48085, true }, + { 48107, true }, + { 48132, true }, + { 48155, true }, + { 48175, true }, + { 48189, true }, + { 48202, true }, + { 48215, true }, + { 48233, true }, + { 48243, true }, + { 48256, true }, + { 48283, true }, + { 48301, true }, + { 48322, true }, + { 48337, true }, + { 48355, true }, + { 48380, true }, + { 48395, false }, + { 48418, false }, + { 48427, true }, + { 48448, true }, + { 48465, true }, + { 48476, true }, + { 48489, true }, + { 48502, false }, + { 48541, true }, + { 48552, true }, + { 48565, true }, + { 48577, true }, + { 48593, true }, + { 48607, false }, { 48622, true }, - { 48632, true }, - { 48655, true }, - { 48667, true }, - { 48676, true }, - { 48690, true }, - { 48705, true }, + { 48642, false }, + { 48658, true }, + { 48677, true }, + { 48688, true }, + { 48701, true }, + { 48713, true }, { 48725, true }, - { 48739, true }, + { 48735, true }, { 48758, true }, - { 48769, true }, - { 48785, true }, - { 48806, true }, - { 48822, true }, - { 48839, true }, - { 48851, true }, - { 48865, true }, - { 48877, true }, - { 48900, true }, + { 48770, true }, + { 48779, true }, + { 48793, true }, + { 48808, true }, + { 48828, true }, + { 48842, true }, + { 48861, true }, + { 48872, true }, + { 48888, true }, + { 48909, true }, { 48925, true }, - { 48945, true }, - { 48962, true }, - { 48971, true }, - { 48988, true }, - { 49000, true }, - { 49015, true }, - { 49034, true }, - { 49047, true }, + { 48942, true }, + { 48954, true }, + { 48968, true }, + { 48980, true }, + { 49003, true }, + { 49028, true }, + { 49048, true }, { 49065, true }, - { 49077, true }, - { 49096, true }, - { 49118, true }, - { 49130, true }, - { 49154, true }, - { 49184, true }, - { 49198, true }, - { 49222, true }, - { 49245, true }, - { 49259, true }, - { 49272, true }, - { 49284, true }, - { 49306, true }, - { 49326, true }, - { 49351, true }, - { 49363, true }, - { 49386, true }, - { 49405, true }, - { 49416, true }, - { 49428, true }, - { 49442, true }, - { 49454, true }, - { 49472, true }, - { 49488, true }, - { 49506, true }, - { 49524, true }, - { 49542, true }, - { 49558, true }, - { 49575, true }, - { 49604, true }, - { 49617, true }, - { 49628, true }, - { 49646, true }, - { 49664, true }, - { 49687, true }, - { 49704, false }, - { 49719, true }, - { 49731, true }, - { 49743, true }, - { 49756, true }, - { 49765, true }, - { 49780, true }, - { 49788, true }, - { 49801, true }, - { 49820, true }, - { 49834, true }, - { 49846, true }, - { 49853, true }, - { 49865, true }, - { 49879, false }, - { 49896, true }, - { 49907, true }, - { 49920, true }, + { 49075, true }, + { 49084, true }, + { 49101, true }, + { 49113, true }, + { 49128, true }, + { 49147, true }, + { 49160, true }, + { 49178, true }, + { 49190, true }, + { 49209, true }, + { 49231, true }, + { 49243, true }, + { 49267, true }, + { 49297, true }, + { 49311, true }, + { 49335, true }, + { 49358, true }, + { 49372, true }, + { 49385, true }, + { 49397, true }, + { 49419, true }, + { 49439, true }, + { 49464, true }, + { 49476, true }, + { 49499, true }, + { 49518, true }, + { 49529, true }, + { 49541, true }, + { 49555, true }, + { 49567, true }, + { 49585, true }, + { 49601, true }, + { 49619, true }, + { 49637, true }, + { 49655, true }, + { 49671, true }, + { 49688, true }, + { 49717, true }, + { 49730, true }, + { 49741, true }, + { 49759, true }, + { 49777, true }, + { 49800, true }, + { 49817, false }, + { 49832, true }, + { 49844, true }, + { 49856, true }, + { 49869, true }, + { 49878, true }, + { 49893, true }, + { 49901, true }, + { 49914, true }, { 49933, true }, - { 49950, true }, - { 49969, false }, - { 49982, true }, - { 50000, true }, - { 50026, true }, - { 50040, true }, - { 50057, true }, - { 50076, true }, - { 50091, true }, - { 50105, true }, - { 50116, true }, - { 50130, true }, - { 50147, true }, - { 50160, true }, - { 50173, true }, - { 50191, true }, - { 50210, true }, - { 50226, true }, - { 50245, true }, - { 50264, true }, - { 50284, true }, - { 50300, true }, - { 50316, true }, - { 50330, true }, - { 50340, true }, - { 50348, true }, - { 50374, true }, - { 50391, true }, - { 50412, true }, - { 50430, true }, + { 49947, true }, + { 49959, true }, + { 49966, true }, + { 49978, true }, + { 49992, false }, + { 50009, true }, + { 50020, true }, + { 50033, true }, + { 50046, true }, + { 50063, true }, + { 50082, false }, + { 50095, true }, + { 50113, true }, + { 50139, true }, + { 50153, true }, + { 50170, true }, + { 50189, true }, + { 50204, true }, + { 50218, true }, + { 50229, true }, + { 50243, true }, + { 50260, true }, + { 50273, true }, + { 50286, true }, + { 50304, true }, + { 50323, true }, + { 50339, true }, + { 50358, true }, + { 50377, true }, + { 50397, true }, + { 50413, true }, + { 50429, true }, + { 50443, true }, + { 50453, true }, { 50461, true }, - { 50480, true }, - { 50496, true }, - { 50507, true }, - { 50521, true }, - { 50540, true }, - { 50552, true }, - { 50568, true }, - { 50589, false }, + { 50478, true }, + { 50499, true }, + { 50517, true }, + { 50548, true }, + { 50567, true }, + { 50583, true }, + { 50594, true }, { 50608, true }, - { 50622, true }, - { 50631, true }, - { 50648, true }, - { 50662, true }, - { 50671, true }, - { 50686, true }, - { 50701, true }, + { 50627, true }, + { 50639, true }, + { 50655, true }, + { 50676, false }, + { 50695, true }, + { 50709, true }, { 50718, true }, - { 50726, true }, - { 50737, true }, - { 50755, true }, - { 50776, true }, - { 50797, true }, - { 50808, true }, - { 50817, true }, - { 50836, true }, - { 50849, true }, - { 50864, true }, - { 50886, true }, - { 50900, false }, - { 50914, true }, - { 50930, true }, - { 50942, true }, - { 50959, true }, - { 50971, true }, - { 50986, true }, - { 50998, true }, - { 51021, true }, - { 51033, true }, - { 51056, true }, - { 51075, true }, - { 51083, true }, - { 51099, true }, - { 51114, true }, - { 51139, true }, - { 51149, true }, - { 51159, true }, - { 51166, true }, - { 51183, true }, - { 51197, true }, - { 51218, true }, - { 51227, true }, - { 51235, true }, - { 51249, false }, - { 51260, true }, - { 51276, false }, - { 51286, false }, - { 51302, true }, - { 51315, true }, - { 51329, true }, - { 51344, true }, - { 51360, true }, - { 51382, true }, - { 51400, true }, - { 51412, true }, - { 51426, true }, - { 51440, true }, - { 51455, true }, - { 51470, true }, - { 51495, true }, - { 51515, true }, - { 51531, true }, - { 51544, true }, - { 51558, true }, - { 51571, true }, - { 51601, true }, - { 51613, true }, - { 51628, true }, - { 51638, true }, - { 51654, true }, - { 51662, false }, - { 51674, true }, - { 51685, true }, - { 51694, true }, - { 51702, true }, - { 51712, true }, - { 51727, true }, - { 51744, true }, - { 51760, true }, - { 51776, true }, + { 50735, true }, + { 50749, true }, + { 50758, true }, + { 50773, true }, + { 50788, true }, + { 50805, true }, + { 50813, true }, + { 50824, true }, + { 50842, true }, + { 50863, true }, + { 50884, true }, + { 50895, true }, + { 50904, true }, + { 50923, true }, + { 50936, true }, + { 50951, true }, + { 50973, true }, + { 50987, false }, + { 51001, true }, + { 51017, true }, + { 51029, true }, + { 51046, true }, + { 51058, true }, + { 51073, true }, + { 51085, true }, + { 51108, true }, + { 51120, true }, + { 51143, true }, + { 51162, true }, + { 51170, true }, + { 51186, true }, + { 51201, true }, + { 51226, true }, + { 51236, true }, + { 51246, true }, + { 51253, true }, + { 51270, true }, + { 51284, true }, + { 51305, true }, + { 51314, true }, + { 51322, true }, + { 51336, false }, + { 51347, true }, + { 51363, false }, + { 51373, false }, + { 51389, true }, + { 51402, true }, + { 51416, true }, + { 51431, true }, + { 51447, true }, + { 51469, true }, + { 51487, true }, + { 51499, true }, + { 51513, true }, + { 51527, true }, + { 51542, true }, + { 51557, true }, + { 51582, true }, + { 51602, true }, + { 51618, true }, + { 51631, true }, + { 51645, true }, + { 51658, true }, + { 51688, true }, + { 51700, true }, + { 51715, true }, + { 51725, true }, + { 51741, true }, + { 51749, false }, + { 51761, true }, + { 51772, true }, + { 51781, true }, { 51789, true }, - { 51805, true }, - { 51818, true }, - { 51825, true }, - { 51842, true }, - { 51851, true }, - { 51859, true }, - { 51873, true }, - { 51881, false }, + { 51799, true }, + { 51814, true }, + { 51831, true }, + { 51847, true }, + { 51863, true }, + { 51876, true }, { 51892, true }, - { 51901, true }, - { 51914, true }, - { 51922, true }, - { 51931, true }, - { 51941, true }, - { 51950, true }, - { 51958, true }, - { 51973, true }, - { 51981, true }, + { 51905, true }, + { 51912, true }, + { 51929, true }, + { 51938, true }, + { 51946, true }, + { 51960, true }, + { 51968, false }, + { 51979, true }, + { 51988, true }, { 52001, true }, - { 52024, true }, + { 52009, true }, + { 52018, true }, + { 52028, true }, { 52037, true }, - { 52051, true }, - { 52070, true }, - { 52089, true }, - { 52103, true }, - { 52112, true }, - { 52132, true }, - { 52155, true }, - { 52165, true }, - { 52175, true }, - { 52193, true }, - { 52213, true }, - { 52226, true }, + { 52045, true }, + { 52060, true }, + { 52068, true }, + { 52088, true }, + { 52111, true }, + { 52124, true }, + { 52138, true }, + { 52157, true }, + { 52176, true }, + { 52190, true }, + { 52199, true }, + { 52219, true }, { 52242, true }, { 52252, true }, - { 52263, true }, - { 52273, true }, - { 52290, true }, - { 52306, true }, + { 52262, true }, + { 52280, true }, + { 52300, true }, { 52313, true }, - { 52332, true }, - { 52345, true }, - { 52356, true }, - { 52363, true }, - { 52374, true }, - { 52385, true }, + { 52329, true }, + { 52339, true }, + { 52350, true }, + { 52360, true }, + { 52377, true }, { 52393, true }, - { 52403, true }, - { 52417, true }, - { 52437, true }, - { 52453, true }, - { 52469, true }, + { 52400, true }, + { 52419, true }, + { 52432, true }, + { 52443, true }, + { 52450, true }, + { 52461, true }, + { 52472, true }, + { 52480, true }, { 52490, true }, - { 52509, true }, - { 52531, true }, - { 52543, true }, - { 52554, false }, - { 52576, true }, - { 52595, true }, - { 52611, true }, - { 52629, true }, - { 52644, true }, - { 52661, true }, - { 52680, true }, - { 52692, true }, - { 52707, true }, - { 52727, true }, - { 52744, true }, - { 52754, true }, - { 52763, true }, - { 52775, true }, - { 52785, true }, + { 52504, true }, + { 52524, true }, + { 52540, true }, + { 52556, true }, + { 52577, true }, + { 52596, true }, + { 52618, true }, + { 52630, true }, + { 52641, false }, + { 52663, true }, + { 52682, true }, + { 52698, true }, + { 52716, true }, + { 52731, true }, + { 52748, true }, + { 52767, true }, + { 52779, true }, { 52794, true }, - { 52803, true }, - { 52812, true }, - { 52821, true }, + { 52814, true }, { 52831, true }, { 52841, true }, { 52850, true }, - { 52859, true }, - { 52869, true }, - { 52887, true }, - { 52903, true }, - { 52911, true }, + { 52862, true }, + { 52872, true }, + { 52881, true }, + { 52890, true }, + { 52899, true }, + { 52908, true }, { 52918, true }, - { 52931, true }, - { 52948, true }, - { 52962, true }, - { 52969, true }, - { 52979, true }, + { 52928, true }, + { 52937, true }, + { 52946, true }, + { 52956, true }, + { 52974, true }, { 52990, true }, - { 53002, true }, - { 53019, true }, - { 53036, true }, + { 52998, true }, + { 53005, true }, + { 53018, true }, + { 53035, true }, + { 53049, true }, { 53056, true }, - { 53075, false }, + { 53066, true }, + { 53077, true }, { 53089, true }, - { 53107, true }, - { 53120, true }, - { 53137, true }, - { 53151, true }, - { 53165, true }, - { 53182, true }, - { 53208, true }, - { 53223, true }, - { 53237, true }, + { 53106, true }, + { 53123, true }, + { 53143, true }, + { 53162, false }, + { 53176, true }, + { 53194, true }, + { 53207, true }, + { 53224, true }, + { 53238, true }, { 53252, true }, - { 53267, true }, - { 53278, true }, - { 53291, true }, - { 53305, true }, - { 53315, true }, - { 53326, true }, - { 53345, true }, - { 53360, true }, - { 53375, true }, + { 53269, true }, + { 53295, true }, + { 53310, true }, + { 53324, true }, + { 53339, true }, + { 53354, true }, + { 53365, true }, + { 53378, true }, + { 53392, true }, { 53402, true }, - { 53412, true }, - { 53424, true }, - { 53435, true }, - { 53443, true }, - { 53454, true }, - { 53463, true }, - { 53471, true }, - { 53482, true }, - { 53497, true }, - { 53524, true }, - { 53534, true }, - { 53545, true }, - { 53556, true }, - { 53566, true }, - { 53580, true }, - { 53594, true }, - { 53605, true }, - { 53612, false }, - { 53620, true }, - { 53628, true }, - { 53644, true }, - { 53658, true }, - { 53674, true }, - { 53688, true }, - { 53695, true }, - { 53704, true }, - { 53711, true }, - { 53723, true }, - { 53730, true }, - { 53737, true }, - { 53743, true }, - { 53759, true }, - { 53771, true }, - { 53785, true }, - { 53812, true }, - { 53844, true }, - { 53866, true }, - { 53877, true }, - { 53888, true }, + { 53413, true }, + { 53432, true }, + { 53447, true }, + { 53462, true }, + { 53489, true }, + { 53499, true }, + { 53511, true }, + { 53522, true }, + { 53530, true }, + { 53541, true }, + { 53550, true }, + { 53558, true }, + { 53569, true }, + { 53584, true }, + { 53611, true }, + { 53621, true }, + { 53632, true }, + { 53643, true }, + { 53653, true }, + { 53667, true }, + { 53681, true }, + { 53692, true }, + { 53699, false }, + { 53707, true }, + { 53715, true }, + { 53731, true }, + { 53745, true }, + { 53761, true }, + { 53775, true }, + { 53782, true }, + { 53791, true }, + { 53798, true }, + { 53810, true }, + { 53817, true }, + { 53824, true }, + { 53830, true }, + { 53846, true }, + { 53858, true }, + { 53872, true }, { 53899, true }, - { 53910, true }, - { 53926, true }, - { 53943, true }, - { 53956, true }, - { 53982, false }, - { 54005, true }, - { 54021, true }, - { 54031, true }, - { 54044, true }, - { 54063, true }, - { 54076, true }, - { 54087, true }, - { 54102, true }, - { 54120, true }, - { 54132, true }, - { 54146, true }, - { 54158, true }, - { 54172, true }, - { 54190, true }, - { 54203, true }, - { 54222, true }, - { 54232, true }, - { 54243, true }, - { 54256, true }, - { 54273, true }, - { 54291, true }, - { 54307, true }, - { 54338, true }, - { 54351, true }, + { 53931, true }, + { 53953, true }, + { 53964, true }, + { 53975, true }, + { 53986, true }, + { 53997, true }, + { 54013, true }, + { 54030, true }, + { 54043, true }, + { 54069, false }, + { 54092, true }, + { 54108, true }, + { 54118, true }, + { 54131, true }, + { 54150, true }, + { 54163, true }, + { 54174, true }, + { 54189, true }, + { 54207, true }, + { 54219, true }, + { 54233, true }, + { 54245, true }, + { 54259, true }, + { 54277, true }, + { 54290, true }, + { 54309, true }, + { 54319, true }, + { 54330, true }, + { 54343, true }, { 54360, true }, { 54378, true }, - { 54392, true }, - { 54411, true }, - { 54429, true }, - { 54444, true }, + { 54394, true }, + { 54425, true }, + { 54438, true }, + { 54447, true }, { 54465, true }, - { 54486, true }, - { 54502, true }, - { 54518, true }, - { 54537, true }, + { 54479, true }, + { 54498, true }, + { 54516, true }, + { 54531, true }, { 54552, true }, { 54573, true }, - { 54593, true }, - { 54613, true }, - { 54633, true }, - { 54649, true }, - { 54666, true }, - { 54684, true }, - { 54704, true }, + { 54589, true }, + { 54605, true }, + { 54624, true }, + { 54639, true }, + { 54660, true }, + { 54680, true }, + { 54700, true }, { 54720, true }, - { 54731, false }, - { 54741, true }, - { 54750, true }, - { 54762, true }, + { 54736, true }, + { 54753, true }, { 54771, true }, - { 54789, true }, - { 54803, true }, - { 54821, false }, - { 54833, true }, - { 54846, true }, - { 54861, true }, + { 54791, true }, + { 54807, true }, + { 54818, false }, + { 54828, true }, + { 54837, true }, + { 54849, true }, + { 54858, true }, { 54876, true }, - { 54891, true }, - { 54899, true }, - { 54917, true }, - { 54951, true }, - { 54962, true }, - { 54975, false }, - { 54989, true }, - { 55007, true }, - { 55018, true }, - { 55036, true }, - { 55047, true }, - { 55062, true }, - { 55073, true }, - { 55087, true }, - { 55102, true }, - { 55118, true }, - { 55138, true }, - { 55155, true }, - { 55167, true }, - { 55196, true }, - { 55229, true }, - { 55241, true }, - { 55253, true }, - { 55270, true }, - { 55282, true }, - { 55294, true }, - { 55309, false }, - { 55321, true }, - { 55330, true }, - { 55342, true }, - { 55354, true }, - { 55371, true }, - { 55386, false }, - { 55400, true }, - { 55410, true }, - { 55430, true }, - { 55448, true }, - { 55461, false }, - { 55475, true }, - { 55486, true }, - { 55499, true }, - { 55508, true }, - { 55518, false }, - { 55534, true }, - { 55546, true }, - { 55561, true }, - { 55575, true }, - { 55589, true }, - { 55603, true }, - { 55617, true }, - { 55637, true }, - { 55658, true }, - { 55676, true }, - { 55687, true }, - { 55707, true }, - { 55720, true }, - { 55733, true }, + { 54890, true }, + { 54908, false }, + { 54920, true }, + { 54933, true }, + { 54948, true }, + { 54963, true }, + { 54978, true }, + { 54986, true }, + { 55004, true }, + { 55038, true }, + { 55049, true }, + { 55062, false }, + { 55076, true }, + { 55094, true }, + { 55105, true }, + { 55123, true }, + { 55134, true }, + { 55149, true }, + { 55160, true }, + { 55174, true }, + { 55189, true }, + { 55205, true }, + { 55225, true }, + { 55242, true }, + { 55254, true }, + { 55283, true }, + { 55316, true }, + { 55328, true }, + { 55340, true }, + { 55357, true }, + { 55372, true }, + { 55384, true }, + { 55396, true }, + { 55411, false }, + { 55423, true }, + { 55432, true }, + { 55444, true }, + { 55456, true }, + { 55473, true }, + { 55488, false }, + { 55502, true }, + { 55512, true }, + { 55532, true }, + { 55550, true }, + { 55563, false }, + { 55577, true }, + { 55588, true }, + { 55601, true }, + { 55610, true }, + { 55620, false }, + { 55636, true }, + { 55648, true }, + { 55663, true }, + { 55677, true }, + { 55691, true }, + { 55705, true }, + { 55719, true }, + { 55739, true }, { 55760, true }, - { 55771, true }, - { 55788, true }, - { 55814, true }, - { 55834, true }, - { 55848, true }, - { 55865, false }, - { 55879, true }, - { 55893, false }, - { 55910, true }, - { 55935, true }, - { 55951, true }, - { 55964, true }, - { 55977, true }, - { 55993, true }, - { 56020, true }, - { 56039, true }, - { 56058, true }, - { 56069, true }, - { 56084, true }, - { 56096, true }, - { 56111, true }, - { 56126, true }, + { 55778, true }, + { 55789, true }, + { 55809, true }, + { 55822, true }, + { 55835, true }, + { 55862, true }, + { 55873, true }, + { 55890, true }, + { 55916, true }, + { 55936, true }, + { 55950, true }, + { 55967, false }, + { 55981, true }, + { 55995, false }, + { 56012, true }, + { 56037, true }, + { 56053, true }, + { 56066, true }, + { 56079, true }, + { 56095, true }, + { 56122, true }, { 56141, true }, - { 56163, true }, - { 56181, true }, - { 56197, true }, - { 56214, true }, - { 56234, true }, - { 56248, true }, - { 56264, true }, - { 56282, true }, - { 56301, true }, - { 56314, true }, - { 56331, true }, - { 56344, true }, - { 56358, true }, - { 56373, true }, - { 56389, true }, - { 56408, true }, - { 56429, true }, + { 56160, true }, + { 56171, true }, + { 56186, true }, + { 56198, true }, + { 56213, true }, + { 56228, true }, + { 56243, true }, + { 56265, true }, + { 56283, true }, + { 56299, true }, + { 56316, true }, + { 56336, true }, + { 56350, true }, + { 56366, true }, + { 56384, true }, + { 56403, true }, + { 56416, true }, + { 56433, true }, { 56446, true }, - { 56462, true }, - { 56479, true }, + { 56460, true }, + { 56475, true }, { 56491, true }, - { 56504, true }, - { 56515, true }, - { 56541, true }, - { 56561, false }, - { 56572, true }, - { 56590, true }, - { 56604, true }, - { 56616, true }, - { 56627, true }, - { 56635, true }, - { 56644, true }, - { 56661, true }, - { 56672, true }, - { 56684, true }, + { 56510, true }, + { 56531, true }, + { 56548, true }, + { 56564, true }, + { 56581, true }, + { 56593, true }, + { 56606, true }, + { 56617, true }, + { 56643, true }, + { 56663, false }, + { 56674, true }, { 56692, true }, - { 56702, true }, - { 56713, true }, - { 56734, true }, + { 56706, true }, + { 56718, true }, + { 56729, true }, + { 56737, true }, { 56746, true }, - { 56757, true }, - { 56765, true }, - { 56772, true }, - { 56780, true }, - { 56791, true }, - { 56802, true }, - { 56812, true }, - { 56828, true }, - { 56841, true }, - { 56856, true }, - { 56873, true }, - { 56895, true }, - { 56916, true }, - { 56924, true }, - { 56937, true }, - { 56947, true }, - { 56961, true }, - { 56972, false }, - { 56992, true }, - { 57007, true }, - { 57020, true }, - { 57033, true }, - { 57045, true }, - { 57057, true }, - { 57078, true }, - { 57092, true }, - { 57106, true }, - { 57123, true }, - { 57138, true }, - { 57152, true }, - { 57166, true }, + { 56763, true }, + { 56774, true }, + { 56786, true }, + { 56794, true }, + { 56804, true }, + { 56815, true }, + { 56836, true }, + { 56848, true }, + { 56859, true }, + { 56867, true }, + { 56874, true }, + { 56882, true }, + { 56893, true }, + { 56904, true }, + { 56914, true }, + { 56930, true }, + { 56943, true }, + { 56958, true }, + { 56975, true }, + { 56997, true }, + { 57018, true }, + { 57026, true }, + { 57039, true }, + { 57049, true }, + { 57063, true }, + { 57074, false }, + { 57094, true }, + { 57109, true }, + { 57122, true }, + { 57135, true }, + { 57147, true }, + { 57159, true }, { 57180, true }, { 57194, true }, { 57208, true }, - { 57223, true }, - { 57235, true }, - { 57249, true }, - { 57267, true }, + { 57225, true }, + { 57240, true }, + { 57254, true }, + { 57268, true }, { 57282, true }, - { 57297, true }, - { 57309, true }, - { 57321, true }, - { 57333, true }, - { 57343, true }, - { 57356, true }, + { 57296, true }, + { 57310, true }, + { 57325, true }, + { 57337, true }, + { 57351, true }, { 57369, true }, - { 57390, true }, - { 57405, true }, - { 57422, true }, + { 57384, true }, + { 57399, true }, + { 57411, true }, + { 57423, true }, { 57435, true }, - { 57450, true }, - { 57462, true }, - { 57475, true }, - { 57490, true }, + { 57445, true }, + { 57458, true }, + { 57471, true }, + { 57492, true }, { 57507, true }, { 57524, true }, - { 57532, true }, - { 57544, true }, - { 57553, true }, - { 57573, true }, - { 57584, true }, - { 57599, true }, - { 57615, true }, - { 57622, true }, - { 57645, true }, - { 57659, true }, - { 57674, true }, - { 57689, true }, - { 57704, true }, - { 57715, true }, - { 57725, true }, - { 57734, true }, - { 57746, true }, - { 57757, true }, - { 57768, true }, - { 57781, true }, - { 57802, true }, - { 57812, true }, - { 57828, true }, - { 57843, true }, + { 57537, true }, + { 57552, true }, + { 57564, true }, + { 57577, true }, + { 57592, true }, + { 57609, true }, + { 57626, true }, + { 57634, true }, + { 57646, true }, + { 57655, true }, + { 57675, true }, + { 57686, true }, + { 57701, true }, + { 57717, true }, + { 57724, true }, + { 57747, true }, + { 57761, true }, + { 57776, true }, + { 57791, true }, + { 57806, true }, + { 57817, true }, + { 57827, true }, + { 57836, true }, + { 57848, true }, { 57859, true }, - { 57876, true }, - { 57892, true }, - { 57909, true }, - { 57923, true }, - { 57938, true }, - { 57954, true }, - { 57969, true }, - { 57979, true }, - { 57992, true }, - { 58004, true }, - { 58032, true }, - { 58044, true }, - { 58058, true }, - { 58072, true }, - { 58083, true }, - { 58099, true }, - { 58110, true }, - { 58123, true }, + { 57870, true }, + { 57883, true }, + { 57904, true }, + { 57914, true }, + { 57930, true }, + { 57945, true }, + { 57961, true }, + { 57978, true }, + { 57994, true }, + { 58011, true }, + { 58025, true }, + { 58040, true }, + { 58056, true }, + { 58071, true }, + { 58081, true }, + { 58094, true }, + { 58106, true }, { 58134, true }, - { 58156, true }, - { 58176, true }, - { 58197, true }, + { 58146, true }, + { 58160, true }, + { 58174, true }, + { 58185, true }, + { 58201, true }, { 58212, true }, - { 58226, true }, - { 58241, true }, - { 58255, true }, - { 58267, true }, + { 58225, true }, + { 58236, true }, + { 58258, true }, { 58278, true }, - { 58297, true }, - { 58309, true }, - { 58326, true }, - { 58339, true }, - { 58353, true }, - { 58366, true }, - { 58383, true }, - { 58396, true }, - { 58408, true }, - { 58421, true }, - { 58433, true }, - { 58446, true }, - { 58459, true }, - { 58470, true }, - { 58488, true }, - { 58506, true }, - { 58518, true }, - { 58533, true }, - { 58548, true }, - { 58562, true }, - { 58578, true }, - { 58592, true }, - { 58600, true }, - { 58629, true }, - { 58648, true }, - { 58661, true }, - { 58686, true }, - { 58703, true }, - { 58724, true }, + { 58299, true }, + { 58314, true }, + { 58328, true }, + { 58343, true }, + { 58357, true }, + { 58369, true }, + { 58380, true }, + { 58399, true }, + { 58411, true }, + { 58428, true }, + { 58441, true }, + { 58454, true }, + { 58471, true }, + { 58484, true }, + { 58496, true }, + { 58509, true }, + { 58521, true }, + { 58534, true }, + { 58547, true }, + { 58558, true }, + { 58576, true }, + { 58594, true }, + { 58606, true }, + { 58621, true }, + { 58636, true }, + { 58650, true }, + { 58666, true }, + { 58680, true }, + { 58688, true }, + { 58717, true }, { 58736, true }, - { 58747, true }, - { 58760, true }, - { 58777, true }, - { 58789, true }, - { 58813, true }, - { 58846, true }, - { 58858, true }, - { 58880, true }, - { 58897, true }, - { 58912, true }, - { 58926, true }, - { 58952, true }, - { 58971, true }, - { 58984, true }, - { 58994, true }, - { 59004, true }, - { 59025, true }, - { 59034, true }, - { 59052, true }, - { 59070, true }, - { 59088, true }, - { 59105, true }, - { 59127, true }, - { 59144, true }, - { 59156, true }, - { 59173, true }, - { 59200, true }, - { 59225, false }, - { 59240, true }, - { 59260, true }, - { 59275, true }, - { 59290, true }, - { 59303, true }, - { 59324, true }, - { 59349, true }, - { 59365, true }, + { 58749, true }, + { 58774, true }, + { 58791, true }, + { 58812, true }, + { 58824, true }, + { 58835, true }, + { 58848, true }, + { 58865, true }, + { 58877, true }, + { 58901, true }, + { 58934, true }, + { 58946, true }, + { 58968, true }, + { 58985, true }, + { 59000, true }, + { 59014, true }, + { 59040, true }, + { 59059, true }, + { 59072, true }, + { 59082, true }, + { 59092, true }, + { 59113, true }, + { 59122, true }, + { 59140, true }, + { 59158, true }, + { 59176, true }, + { 59193, true }, + { 59215, true }, + { 59232, true }, + { 59244, true }, + { 59261, true }, + { 59288, true }, + { 59313, false }, + { 59328, true }, + { 59348, true }, + { 59363, true }, { 59378, true }, - { 59407, true }, - { 59417, true }, - { 59428, false }, - { 59442, true }, - { 59456, true }, - { 59475, true }, - { 59489, true }, - { 59504, false }, - { 59519, true }, - { 59536, true }, - { 59545, true }, - { 59555, true }, - { 59593, true }, - { 59608, true }, - { 59619, true }, - { 59631, true }, - { 59649, true }, - { 59660, true }, - { 59668, true }, - { 59677, true }, - { 59690, true }, - { 59700, true }, - { 59709, false }, - { 59734, true }, - { 59752, false }, - { 59776, true }, - { 59790, true }, - { 59809, true }, + { 59391, true }, + { 59412, true }, + { 59437, true }, + { 59453, true }, + { 59466, true }, + { 59495, true }, + { 59505, true }, + { 59516, false }, + { 59530, true }, + { 59544, true }, + { 59563, true }, + { 59577, true }, + { 59592, false }, + { 59607, true }, + { 59624, true }, + { 59633, true }, + { 59643, true }, + { 59681, true }, + { 59696, true }, + { 59707, true }, + { 59719, true }, + { 59737, true }, + { 59748, true }, + { 59756, true }, + { 59765, true }, + { 59778, true }, + { 59788, true }, + { 59802, true }, + { 59811, false }, { 59836, true }, - { 59848, true }, - { 59860, true }, - { 59868, true }, - { 59877, true }, - { 59891, true }, - { 59908, true }, - { 59924, true }, - { 59939, false }, - { 59951, true }, - { 59963, true }, - { 59980, true }, - { 59990, true }, - { 60002, true }, - { 60014, true }, - { 60024, true }, - { 60035, true }, - { 60048, true }, - { 60062, true }, - { 60079, true }, - { 60097, false }, - { 60117, true }, - { 60129, true }, - { 60141, true }, + { 59854, false }, + { 59878, true }, + { 59892, true }, + { 59911, true }, + { 59938, true }, + { 59950, true }, + { 59962, true }, + { 59970, true }, + { 59979, true }, + { 59993, true }, + { 60010, true }, + { 60026, true }, + { 60041, false }, + { 60053, true }, + { 60065, true }, + { 60082, true }, + { 60092, true }, + { 60104, true }, + { 60116, true }, + { 60126, true }, + { 60137, true }, { 60150, true }, - { 60161, true }, - { 60173, true }, - { 60186, true }, - { 60196, true }, - { 60209, true }, + { 60164, true }, + { 60181, true }, + { 60199, false }, + { 60219, true }, { 60231, true }, - { 60245, true }, - { 60254, true }, - { 60266, true }, - { 60273, true }, - { 60286, true }, + { 60243, true }, + { 60252, true }, + { 60263, true }, + { 60275, true }, + { 60288, true }, { 60298, true }, - { 60313, true }, - { 60322, true }, - { 60331, true }, - { 60341, true }, - { 60355, true }, - { 60372, true }, - { 60383, true }, - { 60397, true }, - { 60406, true }, + { 60311, true }, + { 60333, true }, + { 60347, true }, + { 60356, true }, + { 60368, true }, + { 60375, true }, + { 60388, true }, + { 60400, true }, { 60415, true }, - { 60427, true }, + { 60424, true }, + { 60433, true }, { 60443, true }, - { 60459, true }, - { 60476, true }, - { 60493, true }, - { 60503, true }, - { 60525, true }, - { 60534, true }, - { 60546, true }, - { 60569, true }, - { 60583, true }, - { 60597, true }, - { 60612, true }, - { 60645, true }, - { 60673, true }, - { 60698, true }, - { 60707, true }, - { 60723, true }, - { 60735, true }, - { 60746, true }, - { 60757, true }, - { 60782, true }, - { 60797, true }, - { 60819, true }, - { 60835, true }, - { 60866, true }, - { 60877, true }, - { 60889, true }, - { 60905, true }, - { 60919, true }, - { 60934, true }, - { 60943, true }, - { 60961, true }, - { 60975, true }, - { 60990, true }, - { 61008, true }, - { 61018, true }, - { 61031, true }, - { 61041, true }, - { 61064, true }, - { 61076, true }, - { 61091, true }, - { 61106, true }, + { 60457, true }, + { 60474, true }, + { 60485, true }, + { 60499, true }, + { 60508, true }, + { 60517, true }, + { 60529, true }, + { 60545, true }, + { 60561, true }, + { 60578, true }, + { 60595, true }, + { 60605, true }, + { 60627, true }, + { 60636, true }, + { 60648, true }, + { 60671, true }, + { 60685, true }, + { 60699, true }, + { 60714, true }, + { 60747, true }, + { 60775, true }, + { 60800, true }, + { 60809, true }, + { 60825, true }, + { 60837, true }, + { 60848, true }, + { 60859, true }, + { 60884, true }, + { 60899, true }, + { 60921, true }, + { 60937, true }, + { 60968, true }, + { 60979, true }, + { 60991, true }, + { 61007, true }, + { 61021, true }, + { 61036, true }, + { 61045, true }, + { 61063, true }, + { 61077, true }, + { 61092, true }, + { 61110, true }, { 61120, true }, - { 61134, true }, - { 61147, true }, - { 61159, true }, - { 61173, true }, - { 61184, true }, - { 61196, true }, + { 61133, true }, + { 61143, true }, + { 61166, true }, + { 61178, true }, + { 61193, true }, { 61208, true }, - { 61219, true }, - { 61231, false }, - { 61244, true }, - { 61256, false }, - { 61273, true }, - { 61293, true }, + { 61222, true }, + { 61236, true }, + { 61249, true }, + { 61261, true }, + { 61275, true }, + { 61286, true }, + { 61298, true }, { 61310, true }, - { 61334, true }, - { 61352, true }, - { 61368, true }, - { 61384, true }, - { 61399, true }, - { 61414, true }, - { 61437, true }, - { 61463, true }, - { 61483, true }, - { 61498, true }, - { 61518, true }, - { 61540, false }, - { 61558, true }, - { 61577, true }, - { 61594, true }, - { 61613, true }, - { 61626, true }, - { 61643, true }, - { 61653, false }, - { 61670, true }, - { 61689, true }, - { 61697, true }, - { 61714, true }, + { 61321, true }, + { 61333, false }, + { 61346, true }, + { 61358, false }, + { 61375, true }, + { 61395, true }, + { 61412, true }, + { 61436, true }, + { 61454, true }, + { 61470, true }, + { 61486, true }, + { 61501, true }, + { 61516, true }, + { 61539, true }, + { 61565, true }, + { 61585, true }, + { 61600, true }, + { 61620, true }, + { 61642, false }, + { 61660, true }, + { 61679, true }, + { 61696, true }, + { 61715, true }, { 61728, true }, { 61745, true }, - { 61753, true }, - { 61764, true }, - { 61776, true }, - { 61787, true }, - { 61797, true }, - { 61808, true }, - { 61818, true }, - { 61828, true }, - { 61841, true }, + { 61755, false }, + { 61772, true }, + { 61791, true }, + { 61799, true }, + { 61816, true }, + { 61830, true }, + { 61847, true }, { 61855, true }, { 61866, true }, - { 61879, true }, - { 61898, false }, - { 61906, true }, - { 61917, true }, - { 61928, true }, - { 61941, true }, - { 61954, true }, - { 61973, true }, - { 61994, true }, - { 62010, true }, - { 62034, true }, - { 62046, true }, - { 62060, true }, - { 62081, true }, - { 62095, true }, - { 62106, true }, - { 62117, true }, - { 62131, true }, - { 62143, true }, - { 62158, true }, - { 62174, true }, - { 62186, true }, - { 62200, true }, - { 62215, true }, - { 62233, true }, - { 62248, true }, - { 62262, true }, - { 62284, true }, - { 62301, true }, - { 62316, true }, - { 62332, true }, - { 62346, true }, - { 62367, true }, - { 62383, true }, - { 62402, true }, - { 62421, true }, - { 62438, false }, - { 62458, true }, - { 62488, true }, - { 62514, true }, - { 62531, true }, - { 62553, true }, - { 62573, true }, - { 62587, true }, - { 62610, true }, - { 62629, true }, - { 62651, true }, - { 62669, true }, - { 62687, true }, - { 62702, true }, - { 62713, true }, - { 62724, true }, - { 62734, true }, - { 62751, true }, - { 62770, true }, - { 62780, true }, - { 62798, true }, - { 62817, true }, - { 62827, true }, - { 62845, true }, - { 62854, false }, - { 62865, false }, - { 62885, true }, - { 62893, true }, + { 61878, true }, + { 61889, true }, + { 61899, true }, + { 61910, true }, + { 61920, true }, + { 61930, true }, + { 61943, true }, + { 61957, true }, + { 61968, true }, + { 61981, true }, + { 62000, false }, + { 62008, true }, + { 62019, true }, + { 62030, true }, + { 62043, true }, + { 62056, true }, + { 62075, true }, + { 62091, true }, + { 62115, true }, + { 62127, true }, + { 62141, true }, + { 62162, true }, + { 62176, true }, + { 62187, true }, + { 62198, true }, + { 62212, true }, + { 62224, true }, + { 62239, true }, + { 62255, true }, + { 62267, true }, + { 62281, true }, + { 62296, true }, + { 62314, true }, + { 62329, true }, + { 62343, true }, + { 62365, true }, + { 62382, true }, + { 62397, true }, + { 62413, true }, + { 62427, true }, + { 62448, true }, + { 62464, true }, + { 62483, true }, + { 62502, true }, + { 62519, false }, + { 62539, true }, + { 62569, true }, + { 62595, true }, + { 62612, true }, + { 62634, true }, + { 62654, true }, + { 62668, true }, + { 62691, true }, + { 62710, true }, + { 62732, true }, + { 62750, true }, + { 62768, true }, + { 62783, true }, + { 62794, true }, + { 62805, true }, + { 62815, true }, + { 62832, true }, + { 62851, true }, + { 62861, true }, + { 62879, true }, + { 62898, true }, { 62908, true }, - { 62922, true }, - { 62935, true }, - { 62943, true }, - { 62950, true }, - { 62960, true }, - { 62969, true }, - { 62982, true }, - { 62991, false }, - { 63006, true }, - { 63015, false }, + { 62926, true }, + { 62935, false }, + { 62946, false }, + { 62966, true }, + { 62974, true }, + { 62989, true }, + { 63003, true }, + { 63016, true }, { 63024, true }, + { 63031, true }, { 63041, true }, { 63050, true }, - { 63057, true }, - { 63065, true }, - { 63077, true }, - { 63086, true }, - { 63096, true }, - { 63113, true }, - { 63121, false }, - { 63129, true }, - { 63137, true }, - { 63144, true }, - { 63155, true }, - { 63168, true }, - { 63175, true }, - { 63186, true }, - { 63196, true }, - { 63211, true }, - { 63228, true }, - { 63243, true }, + { 63063, true }, + { 63072, false }, + { 63087, true }, + { 63096, false }, + { 63105, true }, + { 63122, true }, + { 63131, true }, + { 63138, true }, + { 63146, true }, + { 63158, true }, + { 63167, true }, + { 63177, true }, + { 63194, true }, + { 63202, false }, + { 63210, true }, + { 63218, true }, + { 63225, true }, + { 63236, true }, + { 63249, true }, { 63256, true }, - { 63268, true }, - { 63283, true }, - { 63294, true }, - { 63304, true }, - { 63312, true }, - { 63321, true }, - { 63329, true }, - { 63343, true }, - { 63355, true }, - { 63370, true }, - { 63377, true }, - { 63387, true }, - { 63404, true }, - { 63422, true }, - { 63439, true }, - { 63449, true }, - { 63463, true }, - { 63476, false }, - { 63492, true }, - { 63508, true }, - { 63527, true }, - { 63541, true }, - { 63557, true }, - { 63570, true }, - { 63585, true }, - { 63596, true }, + { 63267, true }, + { 63277, true }, + { 63292, true }, + { 63309, true }, + { 63324, true }, + { 63337, true }, + { 63349, true }, + { 63364, true }, + { 63375, true }, + { 63385, true }, + { 63393, true }, + { 63402, true }, + { 63410, true }, + { 63424, true }, + { 63436, true }, + { 63451, true }, + { 63458, true }, + { 63468, true }, + { 63485, true }, + { 63503, true }, + { 63520, true }, + { 63530, true }, + { 63544, true }, + { 63557, false }, + { 63573, true }, + { 63589, true }, { 63608, true }, - { 63633, false }, - { 63642, true }, - { 63662, true }, - { 63671, true }, - { 63693, true }, - { 63703, true }, - { 63716, true }, - { 63728, true }, - { 63737, true }, + { 63622, true }, + { 63638, true }, + { 63651, true }, + { 63666, true }, + { 63677, true }, + { 63689, true }, + { 63714, false }, + { 63723, true }, + { 63743, true }, { 63752, true }, - { 63766, true }, - { 63778, true }, - { 63800, true }, - { 63811, true }, - { 63823, true }, - { 63831, true }, - { 63842, true }, - { 63856, true }, - { 63876, true }, - { 63890, true }, - { 63913, true }, - { 63929, true }, + { 63774, true }, + { 63784, true }, + { 63797, true }, + { 63809, true }, + { 63818, true }, + { 63833, true }, + { 63847, true }, + { 63859, true }, + { 63881, true }, + { 63892, true }, + { 63904, true }, + { 63912, true }, + { 63923, true }, { 63937, true }, - { 63951, true }, - { 63966, true }, - { 63995, true }, - { 64014, false }, - { 64031, true }, - { 64045, true }, - { 64064, true }, - { 64080, true }, - { 64095, true }, - { 64106, true }, - { 64117, true }, - { 64129, true }, - { 64150, true }, - { 64167, true }, - { 64185, true }, - { 64206, true }, - { 64221, true }, - { 64239, true }, - { 64255, true }, - { 64270, true }, - { 64298, true }, - { 64308, true }, - { 64318, true }, - { 64337, false }, - { 64349, true }, - { 64363, true }, - { 64376, true }, - { 64395, true }, - { 64411, true }, - { 64425, true }, - { 64440, true }, - { 64463, true }, + { 63957, true }, + { 63971, true }, + { 63994, true }, + { 64010, true }, + { 64018, true }, + { 64032, true }, + { 64047, true }, + { 64076, true }, + { 64095, false }, + { 64112, true }, + { 64126, true }, + { 64145, true }, + { 64161, true }, + { 64176, true }, + { 64187, true }, + { 64198, true }, + { 64210, true }, + { 64231, true }, + { 64248, true }, + { 64266, true }, + { 64287, true }, + { 64302, true }, + { 64320, true }, + { 64336, true }, + { 64351, true }, + { 64379, true }, + { 64389, true }, + { 64399, true }, + { 64418, false }, + { 64430, true }, + { 64444, true }, + { 64457, true }, { 64476, true }, - { 64493, true }, - { 64508, true }, - { 64529, true }, + { 64492, true }, + { 64506, true }, + { 64521, true }, { 64544, true }, - { 64560, true }, - { 64573, true }, - { 64586, true }, - { 64598, true }, - { 64623, true }, - { 64637, true }, - { 64648, true }, + { 64557, true }, + { 64574, true }, + { 64589, true }, + { 64610, true }, + { 64625, true }, + { 64641, true }, + { 64654, true }, { 64667, true }, - { 64680, true }, - { 64697, true }, - { 64714, true }, - { 64725, true }, - { 64739, true }, + { 64679, true }, + { 64704, true }, + { 64718, true }, + { 64729, true }, { 64748, true }, - { 64755, true }, - { 64764, true }, - { 64779, true }, - { 64790, true }, - { 64814, true }, - { 64825, true }, - { 64835, true }, - { 64848, true }, + { 64761, true }, + { 64778, true }, + { 64795, true }, + { 64806, true }, + { 64820, true }, + { 64829, true }, + { 64836, true }, + { 64845, true }, { 64860, true }, { 64871, true }, - { 64882, true }, - { 64894, true }, - { 64910, true }, - { 64931, true }, - { 64945, true }, - { 64960, true }, - { 64972, true }, - { 64989, true }, - { 65004, true }, - { 65016, true }, + { 64895, true }, + { 64906, true }, + { 64916, true }, + { 64929, true }, + { 64941, true }, + { 64952, true }, + { 64963, true }, + { 64975, true }, + { 64991, true }, + { 65012, true }, { 65026, true }, - { 65042, true }, - { 65063, true }, - { 65080, true }, - { 65109, true }, + { 65041, true }, + { 65053, true }, + { 65070, true }, + { 65085, true }, + { 65097, true }, + { 65107, true }, { 65123, true }, - { 65134, true }, - { 65143, false }, - { 65166, false }, - { 65180, true }, - { 65189, true }, - { 65201, true }, - { 65214, true }, - { 65226, true }, - { 65240, true }, - { 65258, true }, - { 65273, true }, - { 65289, false }, - { 65301, true }, - { 65318, true }, - { 65335, true }, - { 65352, true }, - { 65363, true }, - { 65381, true }, - { 65400, true }, - { 65414, true }, + { 65144, true }, + { 65161, true }, + { 65190, true }, + { 65204, true }, + { 65215, true }, + { 65224, false }, + { 65247, false }, + { 65261, true }, + { 65270, true }, + { 65282, true }, + { 65295, true }, + { 65307, true }, + { 65321, true }, + { 65339, true }, + { 65354, true }, + { 65370, false }, + { 65382, true }, + { 65399, true }, + { 65416, true }, { 65433, true }, - { 65452, true }, - { 65466, true }, - { 65477, true }, - { 65487, true }, - { 65500, true }, - { 65516, true }, - { 65530, true }, - { 65550, true }, - { 65559, true }, - { 65576, true }, - { 65596, true }, - { 65616, true }, - { 65635, true }, - { 65654, true }, - { 65677, false }, - { 65695, true }, - { 65724, true }, - { 65740, true }, - { 65756, true }, - { 65771, true }, - { 65785, true }, - { 65794, true }, - { 65809, true }, - { 65827, true }, - { 65835, true }, - { 65850, true }, - { 65863, true }, - { 65875, true }, - { 65890, true }, - { 65906, false }, - { 65916, false }, + { 65444, true }, + { 65462, true }, + { 65481, true }, + { 65495, true }, + { 65514, true }, + { 65533, true }, + { 65547, true }, + { 65558, true }, + { 65568, true }, + { 65581, true }, + { 65597, true }, + { 65611, true }, + { 65631, true }, + { 65640, true }, + { 65657, true }, + { 65677, true }, + { 65697, true }, + { 65716, true }, + { 65735, false }, + { 65753, true }, + { 65782, true }, + { 65798, true }, + { 65814, true }, + { 65829, true }, + { 65843, true }, + { 65852, true }, + { 65867, true }, + { 65879, true }, + { 65897, true }, + { 65905, true }, + { 65920, true }, { 65933, true }, - { 65946, true }, - { 65964, true }, - { 65978, true }, - { 66000, true }, - { 66022, true }, - { 66040, true }, - { 66051, true }, + { 65945, true }, + { 65960, true }, + { 65976, false }, + { 65986, false }, + { 66003, true }, + { 66016, true }, + { 66034, true }, + { 66048, true }, { 66070, true }, - { 66079, true }, - { 66100, true }, + { 66092, true }, + { 66110, true }, { 66121, true }, - { 66133, true }, - { 66146, true }, - { 66161, true }, - { 66178, true }, - { 66190, true }, - { 66207, true }, + { 66140, true }, + { 66149, true }, + { 66170, true }, + { 66191, true }, + { 66203, true }, { 66216, true }, { 66231, true }, - { 66261, true }, - { 66299, true }, - { 66330, true }, - { 66362, true }, - { 66390, true }, - { 66419, true }, - { 66453, true }, - { 66491, true }, - { 66521, true }, - { 66551, true }, - { 66586, true }, - { 66615, true }, - { 66651, true }, - { 66663, true }, - { 66677, true }, - { 66693, true }, - { 66703, true }, - { 66713, true }, - { 66728, true }, - { 66750, true }, - { 66759, true }, + { 66248, true }, + { 66260, true }, + { 66277, true }, + { 66286, true }, + { 66301, true }, + { 66331, true }, + { 66369, true }, + { 66400, true }, + { 66432, true }, + { 66460, true }, + { 66489, true }, + { 66523, true }, + { 66561, true }, + { 66591, true }, + { 66621, true }, + { 66656, true }, + { 66685, true }, + { 66721, true }, + { 66733, true }, + { 66747, true }, + { 66763, true }, { 66773, true }, { 66783, true }, - { 66803, true }, + { 66798, true }, { 66820, true }, - { 66831, true }, - { 66847, true }, - { 66865, true }, + { 66829, true }, + { 66843, true }, + { 66853, true }, { 66873, true }, - { 66887, true }, - { 66902, true }, - { 66916, true }, - { 66924, true }, - { 66933, true }, - { 66941, true }, - { 66964, true }, - { 66980, true }, - { 66991, true }, - { 67006, true }, - { 67019, true }, - { 67037, true }, - { 67049, true }, - { 67065, true }, - { 67080, true }, - { 67093, true }, - { 67104, true }, + { 66890, true }, + { 66901, true }, + { 66917, true }, + { 66935, true }, + { 66943, true }, + { 66957, true }, + { 66972, true }, + { 66986, true }, + { 66994, true }, + { 67003, true }, + { 67011, true }, + { 67034, true }, + { 67050, true }, + { 67061, true }, + { 67076, true }, + { 67089, true }, + { 67107, true }, { 67119, true }, - { 67136, true }, - { 67147, true }, - { 67156, true }, - { 67165, true }, - { 67181, true }, - { 67191, false }, - { 67210, true }, - { 67224, true }, - { 67242, true }, - { 67250, true }, - { 67259, true }, - { 67274, true }, - { 67284, true }, + { 67135, true }, + { 67150, true }, + { 67163, true }, + { 67174, true }, + { 67189, true }, + { 67206, true }, + { 67217, true }, + { 67226, true }, + { 67235, true }, + { 67251, true }, + { 67261, false }, + { 67280, true }, { 67294, true }, - { 67309, true }, - { 67319, true }, - { 67340, true }, - { 67349, true }, - { 67358, true }, - { 67369, true }, - { 67385, true }, - { 67395, true }, - { 67408, true }, - { 67426, true }, - { 67446, true }, - { 67466, true }, - { 67479, true }, - { 67490, true }, - { 67508, true }, - { 67518, true }, - { 67527, true }, + { 67312, true }, + { 67320, true }, + { 67329, true }, + { 67344, true }, + { 67354, true }, + { 67364, true }, + { 67379, true }, + { 67389, true }, + { 67410, true }, + { 67419, true }, + { 67428, true }, + { 67439, true }, + { 67455, true }, + { 67465, true }, + { 67478, true }, + { 67496, true }, + { 67516, true }, { 67536, true }, - { 67547, true }, - { 67555, false }, - { 67562, true }, - { 67572, true }, - { 67584, true }, - { 67594, true }, - { 67609, true }, - { 67616, true }, - { 67629, false }, - { 67644, true }, + { 67549, true }, + { 67560, true }, + { 67578, true }, + { 67588, true }, + { 67597, true }, + { 67606, true }, + { 67617, true }, + { 67625, false }, + { 67632, true }, + { 67642, true }, + { 67654, true }, { 67664, true }, - { 67684, true }, - { 67703, true }, - { 67720, true }, - { 67731, true }, - { 67741, true }, - { 67756, true }, - { 67766, true }, - { 67776, true }, - { 67792, true }, - { 67802, true }, - { 67816, true }, - { 67833, true }, - { 67854, true }, - { 67863, true }, - { 67879, true }, - { 67899, true }, - { 67912, true }, - { 67922, true }, - { 67934, true }, - { 67943, true }, - { 67953, true }, - { 67967, true }, - { 67978, true }, - { 67986, true }, - { 67993, true }, - { 68012, true }, - { 68026, true }, - { 68051, true }, - { 68069, true }, - { 68087, true }, - { 68101, true }, - { 68110, true }, - { 68123, true }, - { 68140, true }, - { 68153, true }, - { 68170, true }, - { 68187, true }, - { 68205, true }, - { 68215, true }, - { 68230, true }, - { 68259, true }, - { 68277, false }, - { 68290, true }, - { 68306, true }, - { 68322, true }, - { 68335, true }, - { 68348, true }, - { 68359, true }, - { 68372, true }, - { 68382, false }, - { 68400, true }, - { 68413, true }, - { 68430, true }, - { 68443, true }, - { 68459, true }, - { 68478, true }, - { 68493, true }, + { 67679, true }, + { 67686, true }, + { 67699, false }, + { 67714, true }, + { 67734, true }, + { 67754, true }, + { 67773, true }, + { 67790, true }, + { 67801, true }, + { 67811, true }, + { 67826, true }, + { 67836, true }, + { 67846, true }, + { 67862, true }, + { 67872, true }, + { 67886, true }, + { 67903, true }, + { 67924, true }, + { 67933, true }, + { 67949, true }, + { 67969, true }, + { 67982, true }, + { 67992, true }, + { 68004, true }, + { 68013, true }, + { 68023, true }, + { 68037, true }, + { 68048, true }, + { 68056, true }, + { 68063, true }, + { 68082, true }, + { 68096, true }, + { 68121, true }, + { 68139, true }, + { 68157, true }, + { 68171, true }, + { 68180, true }, + { 68193, true }, + { 68210, true }, + { 68223, true }, + { 68240, true }, + { 68257, true }, + { 68275, true }, + { 68285, true }, + { 68300, true }, + { 68329, true }, + { 68347, false }, + { 68360, true }, + { 68376, true }, + { 68392, true }, + { 68405, true }, + { 68418, true }, + { 68429, true }, + { 68442, true }, + { 68452, false }, + { 68470, true }, + { 68483, true }, { 68500, true }, + { 68513, true }, { 68529, true }, - { 68551, true }, - { 68572, true }, + { 68548, true }, + { 68563, true }, + { 68570, true }, { 68599, true }, - { 68619, true }, - { 68627, true }, - { 68638, true }, - { 68658, true }, - { 68677, true }, - { 68693, true }, - { 68707, true }, - { 68718, true }, - { 68729, true }, - { 68740, true }, - { 68752, true }, - { 68770, true }, - { 68786, false }, - { 68801, true }, + { 68621, true }, + { 68642, true }, + { 68669, true }, + { 68689, true }, + { 68697, true }, + { 68708, true }, + { 68728, true }, + { 68747, true }, + { 68763, true }, + { 68777, true }, + { 68788, true }, + { 68799, true }, + { 68810, true }, { 68822, true }, - { 68834, true }, - { 68846, true }, - { 68863, true }, - { 68878, true }, - { 68897, true }, - { 68911, true }, - { 68929, true }, - { 68938, true }, + { 68840, true }, + { 68856, false }, + { 68871, true }, + { 68892, true }, + { 68904, true }, + { 68916, true }, + { 68933, true }, { 68948, true }, - { 68959, true }, - { 68975, true }, - { 68989, true }, - { 69007, true }, - { 69020, true }, - { 69034, true }, - { 69047, true }, - { 69061, true }, - { 69075, true }, - { 69084, true }, - { 69095, true }, - { 69119, true }, - { 69140, true }, - { 69152, true }, - { 69163, false }, - { 69176, true }, - { 69182, true }, - { 69191, true }, - { 69205, true }, - { 69217, true }, - { 69227, true }, - { 69243, true }, - { 69253, true }, - { 69266, true }, - { 69279, true }, - { 69291, true }, - { 69303, true }, - { 69319, true }, - { 69330, true }, - { 69342, true }, - { 69357, true }, - { 69374, true }, - { 69385, true }, - { 69401, false }, - { 69416, true }, - { 69426, true }, - { 69445, true }, - { 69461, true }, - { 69473, true }, - { 69484, true }, - { 69501, true }, - { 69520, true }, - { 69542, true }, - { 69565, true }, - { 69582, true }, - { 69598, true }, - { 69611, true }, - { 69620, false }, - { 69629, true }, - { 69640, true }, - { 69657, true }, - { 69673, true }, - { 69687, true }, - { 69701, true }, - { 69719, false }, + { 68967, true }, + { 68981, true }, + { 68999, true }, + { 69008, true }, + { 69018, true }, + { 69029, true }, + { 69045, true }, + { 69059, true }, + { 69077, true }, + { 69090, true }, + { 69104, true }, + { 69117, true }, + { 69131, true }, + { 69145, true }, + { 69154, true }, + { 69165, true }, + { 69189, true }, + { 69210, true }, + { 69222, true }, + { 69233, false }, + { 69246, true }, + { 69252, true }, + { 69261, true }, + { 69275, true }, + { 69287, true }, + { 69297, true }, + { 69313, true }, + { 69323, true }, + { 69336, true }, + { 69349, true }, + { 69361, true }, + { 69373, true }, + { 69389, true }, + { 69400, true }, + { 69412, true }, + { 69427, true }, + { 69444, true }, + { 69455, true }, + { 69471, false }, + { 69486, true }, + { 69496, true }, + { 69515, true }, + { 69531, true }, + { 69543, true }, + { 69554, true }, + { 69571, true }, + { 69590, true }, + { 69612, true }, + { 69635, true }, + { 69652, true }, + { 69668, true }, + { 69681, true }, + { 69690, false }, + { 69699, true }, + { 69710, true }, { 69727, true }, - { 69736, true }, - { 69749, true }, - { 69766, true }, - { 69776, true }, - { 69788, true }, - { 69798, true }, + { 69743, true }, + { 69757, true }, + { 69771, true }, + { 69789, false }, + { 69797, true }, + { 69806, true }, + { 69819, true }, + { 69836, true }, { 69846, true }, - { 69890, true }, - { 69928, true }, - { 69967, true }, - { 70002, true }, - { 70042, true }, - { 70086, true }, - { 70122, true }, - { 70163, true }, - { 70200, true }, - { 70244, true }, - { 70271, true }, - { 70283, true }, - { 70292, true }, - { 70300, false }, - { 70310, true }, - { 70316, true }, - { 70324, true }, - { 70336, true }, - { 70345, true }, - { 70358, true }, + { 69858, true }, + { 69868, true }, + { 69916, true }, + { 69960, true }, + { 69998, true }, + { 70037, true }, + { 70072, true }, + { 70112, true }, + { 70156, true }, + { 70192, true }, + { 70233, true }, + { 70270, true }, + { 70314, true }, + { 70341, true }, + { 70353, true }, + { 70362, true }, + { 70370, false }, { 70380, true }, - { 70387, true }, - { 70398, true }, - { 70410, true }, - { 70419, true }, - { 70434, true }, - { 70448, true }, - { 70458, true }, - { 70467, true }, + { 70386, true }, + { 70394, true }, + { 70406, true }, + { 70415, true }, + { 70428, true }, + { 70450, true }, + { 70457, true }, + { 70469, true }, { 70478, true }, - { 70490, true }, - { 70503, true }, - { 70519, true }, - { 70528, true }, + { 70493, true }, + { 70507, true }, + { 70517, true }, + { 70526, true }, { 70537, true }, - { 70558, true }, - { 70569, true }, - { 70583, true }, - { 70600, true }, + { 70549, true }, + { 70562, true }, + { 70578, true }, + { 70587, true }, + { 70596, true }, { 70617, true }, - { 70629, true }, - { 70639, true }, - { 70662, true }, + { 70628, true }, + { 70642, true }, + { 70659, true }, { 70676, true }, + { 70688, true }, { 70698, true }, - { 70713, true }, - { 70728, true }, - { 70754, true }, - { 70765, true }, - { 70776, true }, - { 70792, true }, - { 70801, true }, - { 70812, true }, - { 70841, true }, - { 70857, true }, - { 70885, true }, - { 70901, true }, - { 70913, false }, - { 70931, false }, - { 70939, false }, - { 70950, true }, - { 70960, true }, - { 70981, true }, - { 70999, true }, - { 71009, true }, - { 71019, true }, - { 71034, true }, - { 71048, true }, - { 71061, true }, - { 71071, true }, - { 71086, true }, - { 71101, true }, - { 71112, true }, - { 71124, true }, - { 71136, true }, - { 71145, true }, - { 71154, false }, - { 71166, true }, - { 71182, true }, - { 71193, true }, - { 71209, true }, - { 71228, true }, - { 71244, true }, - { 71259, true }, - { 71280, true }, - { 71311, true }, - { 71335, true }, - { 71354, true }, - { 71374, true }, - { 71394, true }, - { 71412, true }, - { 71429, true }, - { 71448, true }, - { 71472, true }, - { 71491, true }, - { 71509, true }, - { 71526, true }, - { 71548, true }, - { 71568, true }, - { 71588, true }, - { 71605, true }, - { 71627, true }, - { 71643, true }, - { 71660, true }, - { 71675, true }, - { 71691, true }, - { 71706, true }, - { 71725, true }, - { 71747, true }, - { 71769, true }, - { 71791, true }, - { 71808, true }, - { 71823, true }, - { 71842, true }, + { 70721, true }, + { 70735, true }, + { 70757, true }, + { 70772, true }, + { 70787, true }, + { 70813, true }, + { 70824, true }, + { 70835, true }, + { 70851, true }, + { 70860, true }, + { 70871, true }, + { 70900, true }, + { 70916, true }, + { 70944, true }, + { 70960, false }, + { 70978, false }, + { 70986, false }, + { 70997, true }, + { 71007, true }, + { 71028, true }, + { 71046, true }, + { 71056, true }, + { 71066, true }, + { 71081, true }, + { 71095, true }, + { 71108, true }, + { 71118, true }, + { 71133, true }, + { 71148, true }, + { 71159, true }, + { 71171, true }, + { 71183, true }, + { 71192, true }, + { 71201, false }, + { 71213, true }, + { 71229, true }, + { 71240, true }, + { 71256, true }, + { 71275, true }, + { 71291, true }, + { 71306, true }, + { 71327, true }, + { 71358, true }, + { 71382, true }, + { 71401, true }, + { 71421, true }, + { 71441, true }, + { 71459, true }, + { 71476, true }, + { 71495, true }, + { 71519, true }, + { 71538, true }, + { 71556, true }, + { 71573, true }, + { 71595, true }, + { 71615, true }, + { 71635, true }, + { 71652, true }, + { 71674, true }, + { 71690, true }, + { 71707, true }, + { 71722, true }, + { 71738, true }, + { 71753, true }, + { 71772, true }, + { 71794, true }, + { 71816, true }, + { 71838, true }, { 71855, true }, - { 71868, true }, - { 71883, true }, - { 71898, true }, - { 71909, true }, - { 71919, true }, - { 71932, true }, - { 71948, true }, - { 71960, true }, - { 71973, false }, - { 71983, false }, - { 71992, true }, - { 72014, true }, - { 72034, true }, - { 72055, true }, - { 72070, true }, + { 71870, true }, + { 71889, true }, + { 71902, true }, + { 71915, true }, + { 71930, true }, + { 71945, true }, + { 71956, true }, + { 71966, true }, + { 71979, true }, + { 71995, true }, + { 72007, true }, + { 72020, false }, + { 72030, false }, + { 72039, true }, + { 72061, true }, { 72081, true }, { 72102, true }, - { 72118, true }, - { 72140, true }, - { 72164, false }, - { 72181, true }, - { 72194, true }, - { 72208, true }, - { 72224, true }, - { 72237, true }, - { 72250, true }, - { 72263, true }, - { 72282, true }, - { 72293, true }, - { 72302, true }, - { 72311, true }, - { 72321, true }, - { 72334, true }, - { 72344, true }, - { 72354, true }, - { 72363, true }, - { 72379, true }, - { 72395, true }, - { 72422, true }, - { 72433, true }, - { 72450, true }, - { 72463, true }, - { 72477, true }, - { 72494, true }, - { 72509, true }, - { 72532, true }, - { 72542, true }, - { 72552, true }, - { 72567, true }, - { 72577, true }, - { 72596, true }, - { 72616, true }, - { 72630, true }, - { 72655, true }, - { 72679, true }, - { 72688, true }, - { 72705, true }, + { 72117, true }, + { 72128, true }, + { 72149, true }, + { 72165, true }, + { 72187, true }, + { 72211, false }, + { 72228, true }, + { 72241, true }, + { 72255, true }, + { 72271, true }, + { 72284, true }, + { 72297, true }, + { 72310, true }, + { 72329, true }, + { 72340, true }, + { 72349, true }, + { 72358, true }, + { 72368, true }, + { 72381, true }, + { 72391, true }, + { 72401, true }, + { 72410, true }, + { 72426, true }, + { 72442, true }, + { 72469, true }, + { 72480, true }, + { 72497, true }, + { 72510, true }, + { 72524, true }, + { 72541, true }, + { 72556, true }, + { 72579, true }, + { 72589, true }, + { 72599, true }, + { 72614, true }, + { 72624, true }, + { 72643, true }, + { 72663, true }, + { 72677, true }, + { 72702, true }, { 72726, true }, - { 72746, true }, - { 72758, true }, - { 72771, true }, - { 72785, true }, - { 72802, true }, - { 72819, false }, + { 72735, true }, + { 72752, true }, + { 72773, true }, + { 72793, true }, + { 72805, true }, + { 72818, true }, { 72832, true }, { 72849, true }, - { 72858, true }, - { 72869, true }, - { 72887, true }, - { 72903, true }, - { 72917, true }, - { 72928, true }, - { 72942, true }, - { 72959, true }, - { 72968, true }, - { 72982, false }, - { 73010, true }, - { 73019, true }, - { 73028, true }, - { 73038, true }, - { 73054, true }, - { 73064, true }, - { 73077, true }, - { 73091, false }, - { 73105, false }, - { 73120, true }, - { 73144, true }, - { 73165, true }, - { 73187, true }, - { 73197, true }, - { 73209, true }, - { 73235, true }, - { 73249, true }, - { 73268, true }, - { 73285, true }, - { 73298, true }, - { 73310, true }, - { 73323, true }, - { 73335, true }, - { 73347, false }, - { 73371, true }, - { 73384, true }, - { 73403, true }, - { 73427, true }, - { 73443, true }, - { 73453, true }, - { 73469, true }, - { 73485, true }, - { 73504, true }, - { 73521, true }, - { 73539, true }, - { 73556, true }, - { 73573, true }, - { 73581, false }, - { 73607, true }, - { 73624, true }, - { 73638, true }, - { 73649, true }, - { 73661, true }, - { 73681, true }, - { 73697, true }, - { 73715, true }, - { 73733, true }, - { 73743, true }, - { 73755, true }, - { 73770, true }, - { 73788, true }, - { 73806, true }, - { 73825, true }, + { 72866, false }, + { 72879, true }, + { 72896, true }, + { 72905, true }, + { 72916, true }, + { 72934, true }, + { 72950, true }, + { 72964, true }, + { 72975, true }, + { 72989, true }, + { 73006, true }, + { 73015, true }, + { 73029, false }, + { 73057, true }, + { 73066, true }, + { 73075, true }, + { 73085, true }, + { 73101, true }, + { 73111, true }, + { 73124, true }, + { 73138, false }, + { 73152, false }, + { 73167, true }, + { 73191, true }, + { 73212, true }, + { 73234, true }, + { 73244, true }, + { 73256, true }, + { 73282, true }, + { 73296, true }, + { 73315, true }, + { 73332, true }, + { 73345, true }, + { 73357, true }, + { 73370, true }, + { 73382, true }, + { 73394, false }, + { 73418, true }, + { 73431, true }, + { 73450, true }, + { 73474, true }, + { 73490, true }, + { 73500, true }, + { 73516, true }, + { 73532, true }, + { 73551, true }, + { 73568, true }, + { 73586, true }, + { 73603, true }, + { 73620, true }, + { 73628, false }, + { 73654, true }, + { 73671, true }, + { 73685, true }, + { 73696, true }, + { 73708, true }, + { 73728, true }, + { 73744, true }, + { 73762, true }, + { 73780, true }, + { 73790, true }, + { 73802, true }, + { 73817, true }, { 73835, true }, - { 73849, true }, - { 73859, true }, - { 73870, true }, - { 73889, true }, - { 73905, true }, - { 73924, true }, + { 73854, true }, + { 73864, true }, + { 73878, true }, + { 73888, true }, + { 73899, true }, + { 73918, true }, { 73934, true }, - { 73946, true }, - { 73957, true }, - { 73967, true }, - { 73983, true }, + { 73953, true }, + { 73963, true }, + { 73975, true }, + { 73986, true }, { 73996, true }, - { 74020, true }, - { 74043, true }, - { 74067, true }, - { 74082, true }, - { 74102, true }, - { 74115, false }, - { 74127, true }, - { 74137, true }, - { 74150, true }, - { 74165, true }, - { 74185, true }, - { 74195, true }, - { 74205, false }, - { 74222, true }, - { 74230, true }, - { 74246, true }, - { 74261, true }, - { 74277, true }, - { 74293, true }, - { 74307, true }, - { 74323, true }, - { 74337, true }, - { 74351, true }, - { 74363, true }, - { 74383, true }, - { 74399, true }, - { 74416, false }, - { 74426, true }, - { 74439, true }, - { 74458, true }, - { 74469, true }, - { 74482, true }, - { 74496, true }, - { 74509, true }, - { 74517, true }, - { 74527, true }, - { 74541, false }, - { 74555, false }, - { 74581, true }, - { 74593, true }, - { 74609, true }, - { 74630, true }, - { 74654, true }, - { 74679, true }, - { 74691, true }, - { 74704, true }, - { 74717, true }, - { 74729, true }, - { 74748, true }, - { 74763, true }, - { 74776, true }, - { 74789, true }, - { 74809, true }, - { 74824, true }, - { 74840, true }, - { 74851, true }, - { 74869, true }, - { 74878, true }, - { 74889, true }, - { 74900, true }, - { 74911, true }, - { 74922, true }, - { 74932, true }, - { 74946, true }, - { 74958, true }, - { 74968, true }, - { 74977, true }, - { 74991, true }, - { 75001, true }, - { 75013, true }, - { 75022, true }, - { 75033, false }, - { 75046, true }, - { 75060, true }, - { 75082, true }, - { 75095, true }, - { 75107, true }, - { 75119, true }, - { 75131, true }, - { 75143, true }, - { 75155, true }, - { 75167, true }, - { 75179, true }, - { 75191, true }, + { 74012, true }, + { 74025, true }, + { 74049, true }, + { 74072, true }, + { 74096, true }, + { 74111, true }, + { 74131, true }, + { 74144, false }, + { 74156, true }, + { 74166, true }, + { 74179, true }, + { 74194, true }, + { 74214, true }, + { 74224, true }, + { 74234, false }, + { 74251, true }, + { 74259, true }, + { 74275, true }, + { 74290, true }, + { 74306, true }, + { 74322, true }, + { 74336, true }, + { 74352, true }, + { 74366, true }, + { 74380, true }, + { 74392, true }, + { 74412, true }, + { 74428, true }, + { 74445, true }, + { 74455, true }, + { 74468, true }, + { 74487, true }, + { 74498, true }, + { 74511, true }, + { 74525, true }, + { 74538, true }, + { 74546, true }, + { 74556, true }, + { 74570, false }, + { 74584, false }, + { 74610, true }, + { 74622, true }, + { 74638, true }, + { 74649, true }, + { 74670, true }, + { 74694, true }, + { 74719, true }, + { 74731, true }, + { 74744, true }, + { 74757, true }, + { 74769, true }, + { 74788, true }, + { 74803, true }, + { 74816, true }, + { 74829, true }, + { 74849, true }, + { 74864, true }, + { 74880, true }, + { 74891, true }, + { 74909, true }, + { 74918, true }, + { 74929, true }, + { 74940, true }, + { 74951, true }, + { 74962, true }, + { 74972, true }, + { 74986, true }, + { 74998, true }, + { 75008, true }, + { 75017, true }, + { 75031, true }, + { 75041, true }, + { 75053, true }, + { 75062, true }, + { 75073, false }, + { 75086, true }, + { 75100, true }, + { 75122, true }, + { 75135, true }, + { 75147, true }, + { 75159, true }, + { 75171, true }, + { 75183, true }, + { 75195, true }, { 75207, true }, - { 75222, true }, - { 75241, true }, - { 75258, true }, - { 75280, true }, - { 75293, false }, - { 75313, true }, - { 75331, true }, - { 75341, true }, - { 75354, true }, - { 75363, true }, - { 75375, true }, - { 75388, true }, + { 75219, true }, + { 75231, true }, + { 75247, true }, + { 75262, true }, + { 75281, true }, + { 75298, true }, + { 75320, true }, + { 75333, false }, + { 75353, true }, + { 75371, true }, + { 75381, true }, + { 75394, true }, { 75403, true }, - { 75422, true }, - { 75436, true }, - { 75447, true }, - { 75471, false }, - { 75492, true }, - { 75504, true }, - { 75514, true }, - { 75523, true }, - { 75538, true }, - { 75551, true }, - { 75562, true }, - { 75573, true }, - { 75586, true }, - { 75599, true }, - { 75608, true }, - { 75620, true }, - { 75629, true }, - { 75638, true }, - { 75652, true }, - { 75666, true }, - { 75686, false }, - { 75711, true }, - { 75724, true }, - { 75733, true }, - { 75754, true }, - { 75775, true }, - { 75785, true }, - { 75800, true }, - { 75812, true }, - { 75824, true }, - { 75849, true }, - { 75865, true }, - { 75876, true }, + { 75415, true }, + { 75428, true }, + { 75443, true }, + { 75462, true }, + { 75476, true }, + { 75487, true }, + { 75511, false }, + { 75532, true }, + { 75544, true }, + { 75554, true }, + { 75563, true }, + { 75578, true }, + { 75591, true }, + { 75602, true }, + { 75613, true }, + { 75626, true }, + { 75639, true }, + { 75648, true }, + { 75660, true }, + { 75669, true }, + { 75678, true }, + { 75692, true }, + { 75706, true }, + { 75726, false }, + { 75751, true }, + { 75764, true }, + { 75773, true }, + { 75794, true }, + { 75815, true }, + { 75825, true }, + { 75840, true }, + { 75852, true }, + { 75864, true }, { 75889, true }, - { 75904, true }, - { 75918, true }, - { 75927, true }, - { 75945, true }, - { 75979, true }, - { 75989, true }, - { 76007, true }, - { 76018, true }, - { 76044, false }, - { 76059, true }, - { 76069, true }, - { 76078, true }, - { 76090, true }, - { 76100, true }, + { 75905, true }, + { 75916, true }, + { 75929, true }, + { 75944, true }, + { 75958, true }, + { 75967, true }, + { 75985, true }, + { 76019, true }, + { 76029, true }, + { 76047, true }, + { 76058, true }, + { 76084, false }, + { 76099, true }, { 76109, true }, - { 76123, false }, - { 76134, true }, - { 76142, true }, - { 76150, true }, - { 76161, true }, - { 76170, true }, - { 76185, true }, - { 76197, true }, - { 76211, true }, + { 76118, true }, + { 76130, true }, + { 76140, true }, + { 76149, true }, + { 76163, false }, + { 76174, true }, + { 76182, true }, + { 76190, true }, + { 76201, true }, + { 76210, true }, { 76225, true }, - { 76245, true }, - { 76257, true }, - { 76275, true }, - { 76291, true }, - { 76305, true }, - { 76322, true }, - { 76335, true }, + { 76237, true }, + { 76251, true }, + { 76265, true }, + { 76285, true }, + { 76297, true }, + { 76315, true }, + { 76331, true }, { 76345, true }, - { 76359, true }, - { 76371, true }, - { 76383, true }, - { 76397, true }, - { 76410, true }, + { 76362, true }, + { 76375, true }, + { 76385, true }, + { 76399, true }, + { 76411, true }, { 76423, true }, - { 76436, true }, - { 76447, true }, - { 76457, true }, - { 76469, true }, + { 76437, true }, + { 76450, true }, + { 76463, true }, { 76476, true }, - { 76485, true }, + { 76487, true }, + { 76497, true }, { 76509, true }, - { 76528, true }, - { 76542, true }, - { 76556, true }, - { 76565, true }, - { 76578, true }, - { 76594, true }, - { 76617, true }, - { 76626, true }, - { 76641, true }, - { 76655, true }, - { 76669, true }, - { 76683, true }, - { 76698, true }, - { 76712, true }, - { 76726, true }, - { 76740, true }, - { 76755, true }, - { 76769, true }, - { 76783, true }, - { 76797, true }, - { 76811, true }, - { 76828, true }, - { 76848, true }, - { 76869, true }, - { 76901, true }, - { 76913, true }, - { 76923, true }, - { 76935, true }, - { 76950, true }, - { 76972, true }, - { 76991, true }, - { 77005, true }, - { 77023, true }, - { 77034, true }, - { 77052, true }, - { 77059, true }, - { 77069, true }, - { 77081, true }, - { 77096, true }, - { 77113, true }, - { 77131, true }, - { 77144, true }, - { 77163, true }, - { 77173, true }, - { 77193, true }, - { 77206, true }, - { 77216, true }, - { 77230, false }, - { 77247, true }, - { 77260, true }, - { 77273, true }, - { 77286, true }, - { 77296, true }, - { 77312, true }, - { 77338, true }, - { 77350, true }, - { 77362, true }, - { 77375, false }, + { 76516, true }, + { 76525, true }, + { 76549, true }, + { 76568, true }, + { 76582, true }, + { 76596, true }, + { 76605, true }, + { 76618, true }, + { 76634, true }, + { 76657, true }, + { 76666, true }, + { 76681, true }, + { 76695, true }, + { 76709, true }, + { 76723, true }, + { 76738, true }, + { 76752, true }, + { 76766, true }, + { 76780, true }, + { 76795, true }, + { 76809, true }, + { 76823, true }, + { 76837, true }, + { 76851, true }, + { 76868, true }, + { 76888, true }, + { 76909, true }, + { 76941, true }, + { 76953, true }, + { 76963, true }, + { 76975, true }, + { 76990, true }, + { 77012, true }, + { 77031, true }, + { 77045, true }, + { 77063, true }, + { 77074, true }, + { 77092, true }, + { 77099, true }, + { 77109, true }, + { 77121, true }, + { 77136, true }, + { 77153, true }, + { 77171, true }, + { 77184, true }, + { 77203, true }, + { 77213, true }, + { 77233, true }, + { 77246, true }, + { 77256, true }, + { 77270, false }, + { 77287, true }, + { 77300, true }, + { 77313, true }, + { 77326, true }, + { 77336, true }, + { 77352, true }, + { 77378, true }, { 77390, true }, - { 77403, true }, - { 77417, true }, - { 77434, true }, - { 77446, true }, - { 77465, true }, - { 77472, true }, - { 77484, true }, - { 77496, true }, - { 77508, true }, - { 77517, true }, - { 77528, true }, - { 77542, true }, - { 77555, true }, - { 77580, true }, - { 77603, false }, - { 77613, true }, - { 77624, true }, - { 77637, true }, - { 77651, true }, - { 77663, true }, - { 77674, true }, - { 77685, true }, - { 77694, true }, - { 77704, true }, - { 77713, true }, - { 77724, true }, + { 77402, true }, + { 77415, false }, + { 77430, true }, + { 77443, true }, + { 77457, true }, + { 77474, true }, + { 77486, true }, + { 77505, true }, + { 77512, true }, + { 77524, true }, + { 77536, true }, + { 77548, true }, + { 77557, true }, + { 77568, true }, + { 77582, true }, + { 77595, true }, + { 77620, true }, + { 77643, false }, + { 77653, true }, + { 77664, true }, + { 77677, true }, + { 77691, true }, + { 77703, true }, + { 77714, true }, + { 77725, true }, + { 77734, true }, { 77744, true }, + { 77753, true }, { 77764, true }, - { 77782, true }, - { 77801, true }, - { 77819, true }, - { 77836, true }, - { 77848, true }, - { 77862, true }, - { 77885, true }, - { 77895, true }, - { 77910, true }, - { 77924, true }, - { 77940, true }, - { 77953, true }, - { 77976, true }, - { 77988, true }, - { 78002, true }, - { 78009, true }, - { 78022, true }, - { 78035, true }, - { 78055, true }, - { 78073, true }, + { 77784, true }, + { 77804, true }, + { 77822, true }, + { 77841, true }, + { 77859, true }, + { 77876, true }, + { 77888, true }, + { 77902, true }, + { 77925, true }, + { 77935, true }, + { 77950, true }, + { 77964, true }, + { 77980, true }, + { 77993, true }, + { 78016, true }, + { 78028, true }, + { 78042, true }, + { 78049, true }, + { 78062, true }, + { 78075, true }, { 78095, true }, - { 78108, true }, - { 78128, true }, - { 78143, true }, - { 78154, true }, + { 78113, true }, + { 78135, true }, + { 78148, true }, { 78168, true }, - { 78181, true }, + { 78183, true }, { 78194, true }, - { 78213, true }, - { 78228, true }, - { 78248, true }, - { 78264, true }, - { 78283, true }, - { 78302, true }, - { 78317, true }, - { 78329, true }, - { 78336, true }, - { 78352, true }, - { 78379, true }, - { 78407, true }, - { 78431, true }, - { 78450, true }, - { 78467, true }, + { 78208, true }, + { 78221, true }, + { 78234, true }, + { 78253, true }, + { 78268, true }, + { 78288, true }, + { 78304, true }, + { 78323, true }, + { 78342, true }, + { 78357, true }, + { 78369, true }, + { 78376, true }, + { 78392, true }, + { 78419, true }, + { 78447, true }, + { 78471, true }, { 78490, true }, - { 78511, true }, + { 78507, true }, { 78530, true }, - { 78548, true }, - { 78566, true }, - { 78584, true }, - { 78596, true }, - { 78605, true }, - { 78628, true }, - { 78642, true }, - { 78654, true }, - { 78667, true }, - { 78677, true }, - { 78688, false }, - { 78698, true }, - { 78718, true }, - { 78731, true }, - { 78746, true }, - { 78755, true }, - { 78767, true }, - { 78783, true }, - { 78793, true }, - { 78800, true }, - { 78817, true }, - { 78830, true }, - { 78839, true }, - { 78846, true }, - { 78859, true }, - { 78872, true }, - { 78881, true }, - { 78894, true }, + { 78551, true }, + { 78570, true }, + { 78588, true }, + { 78606, true }, + { 78624, true }, + { 78636, true }, + { 78645, true }, + { 78668, true }, + { 78682, true }, + { 78694, true }, + { 78707, true }, + { 78717, true }, + { 78728, false }, + { 78738, true }, + { 78758, true }, + { 78771, true }, + { 78786, true }, + { 78795, true }, + { 78807, true }, + { 78823, true }, + { 78833, true }, + { 78840, true }, + { 78857, true }, + { 78870, true }, + { 78879, true }, + { 78886, true }, + { 78899, true }, { 78912, true }, - { 78927, true }, - { 78943, true }, - { 78959, true }, - { 78970, true }, - { 78984, true }, - { 79001, true }, - { 79018, true }, - { 79028, true }, - { 79055, true }, - { 79090, true }, - { 79116, true }, - { 79128, false }, - { 79141, true }, - { 79162, true }, - { 79175, true }, - { 79194, true }, - { 79219, true }, - { 79241, true }, - { 79262, true }, - { 79277, true }, - { 79297, false }, - { 79307, true }, - { 79326, true }, - { 79343, true }, - { 79360, true }, - { 79370, true }, - { 79380, true }, - { 79393, true }, - { 79404, true }, - { 79419, true }, - { 79432, true }, - { 79447, true }, - { 79460, true }, - { 79473, true }, + { 78921, true }, + { 78934, true }, + { 78952, true }, + { 78967, true }, + { 78983, true }, + { 78999, true }, + { 79010, true }, + { 79024, true }, + { 79041, true }, + { 79058, true }, + { 79068, true }, + { 79095, true }, + { 79130, true }, + { 79156, true }, + { 79168, false }, + { 79181, true }, + { 79202, true }, + { 79215, true }, + { 79234, true }, + { 79259, true }, + { 79281, true }, + { 79302, true }, + { 79317, true }, + { 79337, false }, + { 79347, true }, + { 79366, true }, + { 79383, true }, + { 79400, true }, + { 79410, true }, + { 79420, true }, + { 79433, true }, + { 79444, true }, + { 79459, true }, + { 79472, true }, { 79487, true }, - { 79510, true }, - { 79525, true }, - { 79537, true }, + { 79500, true }, + { 79513, true }, + { 79527, true }, { 79550, true }, - { 79564, true }, - { 79583, true }, - { 79607, true }, - { 79629, true }, - { 79650, true }, - { 79675, true }, - { 79698, true }, - { 79718, true }, - { 79729, true }, - { 79741, true }, - { 79753, true }, - { 79773, true }, - { 79790, true }, - { 79807, true }, - { 79828, true }, - { 79851, true }, - { 79867, true }, - { 79887, true }, - { 79896, true }, - { 79911, true }, - { 79921, true }, - { 79938, true }, - { 79949, true }, - { 79968, true }, + { 79565, true }, + { 79577, true }, + { 79590, true }, + { 79604, true }, + { 79623, true }, + { 79647, true }, + { 79669, true }, + { 79690, true }, + { 79715, true }, + { 79738, true }, + { 79758, true }, + { 79769, true }, + { 79781, true }, + { 79793, true }, + { 79813, true }, + { 79830, true }, + { 79847, true }, + { 79868, true }, + { 79891, true }, + { 79907, true }, + { 79927, true }, + { 79936, true }, + { 79951, true }, + { 79961, true }, { 79978, true }, - { 79988, true }, - { 79996, true }, - { 80022, true }, + { 79989, true }, + { 80008, true }, + { 80018, true }, + { 80028, true }, { 80036, true }, - { 80049, true }, { 80062, true }, - { 80071, true }, - { 80078, true }, - { 80085, false }, - { 80101, true }, - { 80110, true }, - { 80127, true }, - { 80142, true }, - { 80156, true }, - { 80168, true }, - { 80180, true }, - { 80203, true }, - { 80217, true }, - { 80232, true }, - { 80248, true }, + { 80076, true }, + { 80089, true }, + { 80102, true }, + { 80111, true }, + { 80118, true }, + { 80125, false }, + { 80141, true }, + { 80150, true }, + { 80167, true }, + { 80182, true }, + { 80196, true }, + { 80208, true }, + { 80231, true }, + { 80245, true }, { 80260, true }, - { 80275, true }, - { 80291, true }, - { 80308, true }, - { 80326, true }, - { 80347, true }, - { 80364, true }, - { 80381, true }, - { 80398, true }, - { 80415, true }, - { 80432, true }, - { 80449, true }, - { 80466, true }, - { 80483, true }, - { 80499, true }, - { 80513, true }, - { 80538, true }, - { 80549, true }, - { 80565, true }, - { 80584, true }, - { 80606, false }, - { 80619, true }, - { 80639, true }, - { 80648, false }, - { 80664, true }, - { 80678, true }, - { 80691, true }, - { 80701, true }, - { 80712, true }, - { 80726, true }, + { 80276, true }, + { 80288, true }, + { 80303, true }, + { 80319, true }, + { 80336, true }, + { 80354, true }, + { 80375, true }, + { 80392, true }, + { 80409, true }, + { 80426, true }, + { 80443, true }, + { 80460, true }, + { 80477, true }, + { 80494, true }, + { 80511, true }, + { 80527, true }, + { 80541, true }, + { 80566, true }, + { 80577, true }, + { 80593, true }, + { 80609, true }, + { 80625, true }, + { 80644, true }, + { 80666, false }, + { 80679, true }, + { 80699, false }, + { 80715, true }, + { 80729, true }, { 80742, true }, - { 80754, true }, - { 80768, true }, - { 80783, true }, + { 80752, true }, + { 80763, true }, + { 80777, true }, { 80793, true }, - { 80803, false }, - { 80813, true }, - { 80822, true }, - { 80830, true }, - { 80840, true }, - { 80853, true }, - { 80872, true }, + { 80805, true }, + { 80819, true }, + { 80834, true }, + { 80844, true }, + { 80854, false }, + { 80864, true }, + { 80873, true }, { 80881, true }, { 80891, true }, - { 80914, true }, - { 80930, false }, - { 80950, true }, - { 80973, true }, - { 80987, true }, - { 80999, true }, - { 81008, true }, - { 81025, true }, - { 81044, true }, - { 81061, false }, - { 81073, true }, - { 81084, false }, - { 81096, true }, - { 81107, true }, - { 81121, true }, - { 81136, true }, - { 81154, true }, - { 81164, true }, + { 80904, true }, + { 80923, true }, + { 80932, true }, + { 80942, true }, + { 80965, true }, + { 80981, false }, + { 81001, true }, + { 81024, true }, + { 81038, true }, + { 81050, true }, + { 81059, true }, + { 81076, true }, + { 81095, true }, + { 81112, false }, + { 81124, true }, + { 81135, false }, + { 81147, true }, + { 81158, true }, { 81172, true }, - { 81183, true }, - { 81197, true }, - { 81211, true }, - { 81224, false }, - { 81237, true }, - { 81249, true }, - { 81264, true }, - { 81293, true }, - { 81307, true }, - { 81321, true }, - { 81336, false }, - { 81350, true }, - { 81362, true }, - { 81376, true }, - { 81390, true }, - { 81402, true }, - { 81416, true }, - { 81430, true }, - { 81442, true }, - { 81452, true }, - { 81468, true }, - { 81484, true }, + { 81187, true }, + { 81205, true }, + { 81215, true }, + { 81223, true }, + { 81234, true }, + { 81248, true }, + { 81262, true }, + { 81275, false }, + { 81288, true }, + { 81300, true }, + { 81315, true }, + { 81344, true }, + { 81358, true }, + { 81372, true }, + { 81387, false }, + { 81401, true }, + { 81413, true }, + { 81427, true }, + { 81441, true }, + { 81453, true }, + { 81467, true }, + { 81481, true }, + { 81493, true }, { 81503, true }, - { 81522, false }, - { 81551, true }, - { 81565, true }, - { 81579, true }, - { 81597, true }, - { 81618, true }, - { 81633, true }, - { 81646, true }, - { 81664, true }, + { 81519, true }, + { 81535, true }, + { 81554, true }, + { 81573, false }, + { 81602, true }, + { 81616, true }, + { 81630, true }, + { 81648, true }, + { 81669, true }, { 81684, true }, - { 81696, true }, - { 81708, true }, - { 81723, true }, - { 81746, true }, - { 81770, true }, - { 81794, true }, - { 81818, true }, - { 81828, true }, - { 81842, true }, - { 81864, true }, - { 81896, true }, - { 81907, true }, + { 81697, true }, + { 81715, true }, + { 81735, true }, + { 81747, true }, + { 81759, true }, + { 81774, true }, + { 81797, true }, + { 81821, true }, + { 81845, true }, + { 81869, true }, + { 81879, true }, + { 81893, true }, { 81915, true }, - { 81924, true }, - { 81934, true }, - { 81946, true }, - { 81961, true }, - { 81975, false }, - { 81995, true }, - { 82008, true }, - { 82019, true }, - { 82028, true }, - { 82035, true }, + { 81947, true }, + { 81958, true }, + { 81966, true }, + { 81975, true }, + { 81985, true }, + { 81997, true }, + { 82012, true }, + { 82026, false }, { 82046, true }, - { 82055, true }, - { 82068, true }, - { 82085, true }, - { 82099, true }, - { 82117, true }, - { 82140, true }, - { 82155, false }, - { 82166, false }, - { 82178, true }, + { 82059, true }, + { 82070, true }, + { 82079, true }, + { 82086, true }, + { 82097, true }, + { 82106, true }, + { 82119, true }, + { 82136, true }, + { 82150, true }, + { 82168, true }, { 82191, true }, - { 82204, true }, - { 82230, false }, - { 82246, true }, - { 82256, true }, - { 82264, true }, - { 82273, true }, - { 82285, true }, - { 82297, true }, - { 82309, false }, - { 82321, true }, + { 82206, false }, + { 82217, false }, + { 82229, false }, + { 82240, true }, + { 82253, true }, + { 82266, true }, + { 82292, false }, + { 82308, true }, + { 82318, true }, + { 82326, true }, { 82335, true }, { 82347, true }, - { 82364, true }, - { 82376, true }, - { 82396, true }, - { 82407, true }, - { 82423, true }, - { 82435, true }, - { 82452, true }, - { 82472, true }, + { 82359, true }, + { 82371, false }, + { 82383, true }, + { 82397, true }, + { 82409, true }, + { 82421, true }, + { 82438, true }, + { 82450, true }, + { 82470, true }, { 82481, true }, - { 82494, true }, - { 82513, true }, + { 82497, true }, + { 82509, true }, { 82526, true }, - { 82544, true }, - { 82557, true }, - { 82581, true }, - { 82595, true }, - { 82612, true }, - { 82627, true }, - { 82639, true }, - { 82651, true }, - { 82666, true }, - { 82683, true }, - { 82691, true }, - { 82703, true }, - { 82722, true }, - { 82739, true }, - { 82756, true }, - { 82771, true }, - { 82783, true }, - { 82808, true }, - { 82823, false }, - { 82836, false }, - { 82848, true }, - { 82868, true }, - { 82880, true }, - { 82893, true }, - { 82905, true }, - { 82919, true }, - { 82937, true }, - { 82949, true }, - { 82973, true }, - { 82986, true }, - { 83005, true }, - { 83017, true }, - { 83029, true }, - { 83053, true }, - { 83074, true }, - { 83088, true }, - { 83102, true }, - { 83115, false }, - { 83131, true }, - { 83155, true }, - { 83167, true }, - { 83180, true }, - { 83213, true }, - { 83245, true }, - { 83263, true }, - { 83272, true }, - { 83282, true }, - { 83293, true }, - { 83305, true }, - { 83315, true }, - { 83326, true }, - { 83338, true }, - { 83347, true }, + { 82546, true }, + { 82555, true }, + { 82568, true }, + { 82587, true }, + { 82600, true }, + { 82618, true }, + { 82631, true }, + { 82655, true }, + { 82669, true }, + { 82686, true }, + { 82701, true }, + { 82713, true }, + { 82725, true }, + { 82740, true }, + { 82757, true }, + { 82765, true }, + { 82777, true }, + { 82796, true }, + { 82813, true }, + { 82830, true }, + { 82845, true }, + { 82857, true }, + { 82882, true }, + { 82897, false }, + { 82910, false }, + { 82922, true }, + { 82942, true }, + { 82954, true }, + { 82967, true }, + { 82979, true }, + { 82993, true }, + { 83011, true }, + { 83023, true }, + { 83047, true }, + { 83060, true }, + { 83079, true }, + { 83091, true }, + { 83103, true }, + { 83127, true }, + { 83148, true }, + { 83162, true }, + { 83176, true }, + { 83189, false }, + { 83205, true }, + { 83229, true }, + { 83241, true }, + { 83254, true }, + { 83287, true }, + { 83319, true }, + { 83337, true }, + { 83346, true }, { 83356, true }, - { 83377, true }, - { 83398, true }, - { 83408, true }, - { 83420, true }, - { 83436, true }, - { 83458, true }, - { 83476, true }, - { 83495, true }, - { 83514, true }, - { 83524, false }, - { 83538, true }, - { 83552, true }, - { 83565, true }, - { 83586, true }, - { 83599, true }, - { 83608, true }, - { 83621, true }, - { 83629, false }, - { 83646, true }, + { 83367, true }, + { 83379, true }, + { 83389, true }, + { 83400, true }, + { 83412, true }, + { 83421, true }, + { 83430, true }, + { 83451, true }, + { 83472, true }, + { 83482, true }, + { 83494, true }, + { 83510, true }, + { 83532, true }, + { 83550, true }, + { 83569, true }, + { 83588, true }, + { 83598, false }, + { 83612, true }, + { 83626, true }, + { 83639, true }, { 83660, true }, - { 83676, true }, + { 83673, true }, + { 83682, true }, { 83695, true }, - { 83714, true }, - { 83724, true }, - { 83738, true }, - { 83746, true }, - { 83760, true }, - { 83779, false }, - { 83797, true }, - { 83806, true }, - { 83819, true }, - { 83832, true }, - { 83847, true }, - { 83867, false }, + { 83703, false }, + { 83720, true }, + { 83734, true }, + { 83750, true }, + { 83769, true }, + { 83788, true }, + { 83798, true }, + { 83812, true }, + { 83820, true }, + { 83834, true }, + { 83853, false }, + { 83871, true }, { 83880, true }, - { 83897, true }, - { 83910, true }, - { 83923, true }, - { 83947, true }, - { 83974, true }, + { 83893, true }, + { 83906, true }, + { 83921, true }, + { 83941, false }, + { 83954, true }, + { 83971, true }, { 83984, true }, - { 83997, false }, - { 84011, true }, - { 84023, true }, - { 84036, true }, - { 84050, true }, - { 84062, true }, - { 84077, true }, - { 84095, true }, - { 84108, true }, - { 84131, true }, - { 84154, false }, - { 84165, true }, - { 84183, true }, - { 84199, true }, - { 84217, true }, - { 84237, true }, - { 84259, true }, - { 84275, true }, - { 84292, true }, - { 84309, true }, - { 84326, true }, - { 84344, true }, - { 84358, true }, - { 84371, true }, - { 84388, true }, - { 84403, true }, - { 84417, true }, - { 84428, true }, - { 84444, true }, - { 84453, true }, - { 84472, true }, - { 84487, true }, - { 84495, true }, - { 84504, true }, - { 84515, true }, - { 84530, true }, - { 84545, true }, - { 84562, false }, - { 84573, true }, - { 84589, true }, - { 84603, true }, - { 84615, true }, - { 84629, true }, - { 84637, true }, - { 84657, true }, - { 84678, true }, - { 84688, true }, - { 84697, true }, - { 84713, true }, - { 84723, true }, - { 84729, true }, - { 84741, true }, - { 84749, true }, - { 84771, true }, - { 84785, true }, - { 84793, true }, - { 84808, true }, - { 84819, true }, - { 84832, true }, - { 84848, true }, - { 84866, false }, - { 84879, true }, - { 84893, true }, - { 84902, true }, + { 83997, true }, + { 84021, true }, + { 84048, true }, + { 84058, true }, + { 84071, false }, + { 84085, true }, + { 84097, true }, + { 84110, true }, + { 84124, true }, + { 84136, true }, + { 84151, true }, + { 84169, true }, + { 84182, true }, + { 84205, true }, + { 84228, false }, + { 84239, true }, + { 84257, true }, + { 84273, true }, + { 84291, true }, + { 84311, true }, + { 84333, true }, + { 84349, true }, + { 84366, true }, + { 84383, true }, + { 84400, true }, + { 84418, true }, + { 84432, true }, + { 84445, true }, + { 84462, true }, + { 84477, true }, + { 84491, true }, + { 84502, true }, + { 84518, true }, + { 84527, true }, + { 84546, true }, + { 84561, true }, + { 84569, true }, + { 84578, true }, + { 84593, true }, + { 84608, true }, + { 84626, true }, + { 84643, false }, + { 84654, true }, + { 84670, true }, + { 84684, true }, + { 84696, true }, + { 84710, true }, + { 84718, true }, + { 84738, true }, + { 84759, true }, + { 84769, true }, + { 84778, true }, + { 84794, true }, + { 84804, true }, + { 84810, true }, + { 84822, true }, + { 84830, true }, + { 84852, true }, + { 84866, true }, + { 84874, true }, + { 84889, true }, + { 84900, true }, { 84913, true }, - { 84933, true }, - { 84945, true }, - { 84957, true }, - { 84976, true }, - { 84995, true }, - { 85003, true }, - { 85020, true }, - { 85039, true }, - { 85048, true }, + { 84929, true }, + { 84947, false }, + { 84960, true }, + { 84974, true }, + { 84983, true }, + { 84994, true }, + { 85014, true }, + { 85026, true }, + { 85038, true }, { 85057, true }, { 85076, true }, - { 85087, true }, - { 85103, true }, - { 85110, true }, - { 85122, true }, - { 85143, true }, - { 85160, true }, - { 85173, true }, - { 85183, true }, - { 85196, true }, - { 85207, true }, - { 85232, true }, - { 85247, true }, - { 85266, true }, - { 85293, true }, - { 85312, false }, - { 85326, true }, - { 85337, true }, - { 85352, true }, - { 85364, true }, - { 85375, true }, - { 85390, true }, - { 85399, true }, - { 85415, true }, - { 85429, true }, - { 85443, true }, - { 85460, true }, + { 85084, true }, + { 85101, true }, + { 85120, true }, + { 85129, true }, + { 85138, true }, + { 85157, true }, + { 85168, true }, + { 85184, true }, + { 85191, true }, + { 85203, true }, + { 85224, true }, + { 85241, true }, + { 85254, true }, + { 85264, true }, + { 85277, true }, + { 85288, true }, + { 85313, true }, + { 85328, true }, + { 85347, true }, + { 85374, true }, + { 85393, false }, + { 85407, true }, + { 85418, true }, + { 85433, true }, + { 85445, true }, + { 85456, true }, { 85471, true }, - { 85487, true }, - { 85507, true }, - { 85516, true }, - { 85527, true }, - { 85547, false }, - { 85571, true }, - { 85582, false }, - { 85590, true }, + { 85480, true }, + { 85496, true }, + { 85510, true }, + { 85524, true }, + { 85541, true }, + { 85552, true }, + { 85568, true }, + { 85588, true }, + { 85597, true }, { 85608, true }, - { 85632, true }, - { 85650, true }, - { 85672, true }, - { 85697, true }, + { 85628, false }, + { 85652, true }, + { 85663, false }, + { 85671, true }, + { 85689, true }, { 85713, true }, - { 85725, true }, - { 85737, true }, - { 85758, true }, - { 85772, true }, - { 85785, false }, - { 85802, true }, - { 85824, true }, - { 85844, true }, - { 85871, true }, - { 85890, true }, - { 85902, true }, - { 85922, true }, - { 85930, true }, - { 85939, true }, - { 85956, true }, + { 85731, true }, + { 85753, true }, + { 85778, true }, + { 85794, true }, + { 85806, true }, + { 85818, true }, + { 85839, true }, + { 85853, true }, + { 85866, false }, + { 85883, true }, + { 85905, true }, + { 85925, true }, + { 85952, true }, { 85971, true }, - { 85986, true }, - { 86015, true }, + { 85983, true }, + { 86003, true }, + { 86011, true }, + { 86020, true }, { 86037, true }, - { 86055, true }, - { 86069, true }, - { 86082, true }, - { 86097, true }, - { 86110, true }, - { 86120, true }, + { 86052, true }, + { 86067, true }, + { 86096, true }, + { 86118, true }, { 86136, true }, - { 86149, true }, - { 86167, true }, - { 86185, false }, - { 86193, true }, - { 86206, true }, - { 86213, false }, - { 86233, true }, - { 86242, true }, - { 86257, true }, - { 86275, true }, + { 86150, true }, + { 86163, true }, + { 86178, true }, + { 86191, true }, + { 86201, true }, + { 86217, true }, + { 86230, true }, + { 86248, true }, + { 86266, false }, + { 86274, true }, { 86287, true }, - { 86296, false }, - { 86306, true }, + { 86294, false }, { 86314, true }, - { 86335, true }, - { 86349, true }, - { 86366, true }, - { 86377, true }, + { 86323, true }, + { 86338, true }, + { 86356, true }, + { 86368, true }, + { 86377, false }, { 86387, true }, - { 86404, true }, - { 86426, true }, + { 86395, true }, + { 86416, true }, + { 86430, true }, { 86447, true }, - { 86462, true }, - { 86479, true }, - { 86489, true }, - { 86504, true }, - { 86520, true }, - { 86531, true }, + { 86458, true }, + { 86468, true }, + { 86485, true }, + { 86507, true }, + { 86528, true }, { 86543, true }, - { 86562, true }, - { 86584, true }, - { 86597, true }, + { 86560, true }, + { 86570, true }, + { 86585, true }, + { 86601, true }, { 86612, true }, - { 86632, true }, - { 86648, true }, - { 86664, true }, - { 86674, true }, - { 86686, true }, - { 86694, true }, - { 86713, false }, - { 86732, true }, + { 86624, true }, + { 86643, true }, + { 86665, true }, + { 86678, true }, + { 86693, true }, + { 86713, true }, + { 86729, true }, { 86745, true }, - { 86762, true }, - { 86774, true }, - { 86788, true }, - { 86808, true }, - { 86822, true }, - { 86834, true }, - { 86847, true }, - { 86861, true }, - { 86886, true }, - { 86901, true }, + { 86755, true }, + { 86767, true }, + { 86775, true }, + { 86794, false }, + { 86813, true }, + { 86826, true }, + { 86843, true }, + { 86855, true }, + { 86869, true }, + { 86889, true }, + { 86903, true }, { 86915, true }, - { 86937, true }, - { 86953, true }, - { 86972, true }, - { 86985, true }, - { 87002, true }, - { 87020, true }, - { 87033, true }, - { 87043, true }, - { 87058, true }, - { 87073, true }, + { 86928, true }, + { 86942, true }, + { 86967, true }, + { 86982, true }, + { 86996, true }, + { 87018, true }, + { 87034, true }, + { 87053, true }, + { 87066, true }, { 87083, true }, - { 87102, true }, - { 87115, true }, - { 87140, true }, - { 87155, true }, - { 87173, true }, - { 87186, true }, - { 87198, true }, - { 87209, true }, - { 87223, true }, + { 87101, true }, + { 87114, true }, + { 87124, true }, + { 87139, true }, + { 87154, true }, + { 87164, true }, + { 87183, true }, + { 87196, true }, + { 87221, true }, { 87236, true }, { 87254, true }, - { 87273, true }, - { 87287, true }, - { 87303, true }, - { 87322, true }, - { 87334, true }, - { 87347, true }, - { 87359, true }, - { 87375, true }, - { 87391, true }, - { 87407, true }, - { 87418, true }, - { 87433, true }, - { 87448, true }, - { 87462, true }, - { 87480, true }, - { 87500, true }, - { 87519, true }, - { 87532, true }, - { 87556, true }, - { 87566, true }, - { 87579, true }, - { 87591, true }, - { 87601, true }, + { 87267, true }, + { 87279, true }, + { 87290, true }, + { 87304, true }, + { 87317, true }, + { 87335, true }, + { 87354, true }, + { 87368, true }, + { 87384, true }, + { 87403, true }, + { 87415, true }, + { 87428, true }, + { 87440, true }, + { 87456, true }, + { 87472, true }, + { 87488, true }, + { 87499, true }, + { 87514, true }, + { 87529, true }, + { 87543, true }, + { 87561, true }, + { 87581, true }, + { 87600, true }, { 87613, true }, - { 87629, true }, { 87637, true }, - { 87645, true }, + { 87647, true }, { 87660, true }, - { 87673, true }, - { 87684, true }, - { 87697, true }, - { 87708, true }, - { 87724, true }, - { 87735, true }, - { 87747, true }, - { 87757, true }, - { 87774, true }, - { 87792, false }, + { 87672, true }, + { 87682, true }, + { 87694, true }, + { 87710, true }, + { 87718, true }, + { 87726, true }, + { 87741, true }, + { 87754, true }, + { 87765, true }, + { 87778, true }, + { 87789, true }, { 87805, true }, - { 87820, true }, - { 87837, true }, + { 87816, true }, + { 87828, true }, + { 87838, true }, { 87855, true }, - { 87869, false }, - { 87887, true }, - { 87903, true }, - { 87919, true }, - { 87928, true }, - { 87937, true }, - { 87952, true }, - { 87962, true }, - { 87977, true }, - { 87987, true }, - { 88001, true }, - { 88013, true }, - { 88030, true }, - { 88044, true }, - { 88052, true }, - { 88060, true }, - { 88069, true }, - { 88081, true }, - { 88092, true }, - { 88101, false }, - { 88109, true }, - { 88135, true }, - { 88148, true }, - { 88161, true }, - { 88169, true }, - { 88183, true }, - { 88194, true }, - { 88204, true }, - { 88221, true }, - { 88233, true }, - { 88248, true }, - { 88257, true }, - { 88268, true }, - { 88279, true }, - { 88290, true }, - { 88305, true }, - { 88318, true }, - { 88330, true }, - { 88343, true }, - { 88351, true }, - { 88365, true }, - { 88380, true }, - { 88391, false }, - { 88405, true }, - { 88426, true }, - { 88437, true }, - { 88455, true }, - { 88466, true }, - { 88479, true }, - { 88498, true }, - { 88512, true }, - { 88528, true }, - { 88541, true }, - { 88556, true }, - { 88569, true }, - { 88583, false }, - { 88599, true }, - { 88610, true }, - { 88629, true }, - { 88642, true }, - { 88665, true }, - { 88674, true }, - { 88685, true }, - { 88696, true }, - { 88705, true }, + { 87873, false }, + { 87886, true }, + { 87901, true }, + { 87918, true }, + { 87936, true }, + { 87950, false }, + { 87968, true }, + { 87984, true }, + { 88000, true }, + { 88009, true }, + { 88018, true }, + { 88033, true }, + { 88043, true }, + { 88058, true }, + { 88068, true }, + { 88082, true }, + { 88094, true }, + { 88111, true }, + { 88125, true }, + { 88133, true }, + { 88141, true }, + { 88150, true }, + { 88162, true }, + { 88173, true }, + { 88182, false }, + { 88190, true }, + { 88216, true }, + { 88229, true }, + { 88242, true }, + { 88250, true }, + { 88264, true }, + { 88275, true }, + { 88285, true }, + { 88302, true }, + { 88314, true }, + { 88329, true }, + { 88338, true }, + { 88349, true }, + { 88360, true }, + { 88371, true }, + { 88386, true }, + { 88399, true }, + { 88411, true }, + { 88424, true }, + { 88432, true }, + { 88446, true }, + { 88461, true }, + { 88472, false }, + { 88486, true }, + { 88507, true }, + { 88518, true }, + { 88536, true }, + { 88547, true }, + { 88560, true }, + { 88579, true }, + { 88593, true }, + { 88609, true }, + { 88622, true }, + { 88637, true }, + { 88650, true }, + { 88664, false }, + { 88680, true }, + { 88691, true }, + { 88710, true }, { 88723, true }, - { 88737, true }, - { 88754, true }, - { 88772, true }, - { 88791, true }, - { 88801, true }, - { 88814, true }, - { 88825, true }, - { 88834, true }, - { 88851, true }, - { 88871, true }, - { 88885, true }, - { 88893, true }, - { 88903, true }, - { 88911, true }, - { 88921, true }, - { 88929, true }, - { 88936, true }, - { 88949, true }, - { 88960, true }, + { 88746, true }, + { 88755, true }, + { 88766, true }, + { 88777, true }, + { 88786, true }, + { 88804, true }, + { 88818, true }, + { 88835, true }, + { 88853, true }, + { 88872, true }, + { 88882, true }, + { 88895, true }, + { 88906, true }, + { 88915, true }, + { 88932, true }, + { 88952, true }, + { 88966, true }, { 88974, true }, - { 88988, true }, + { 88984, true }, + { 88992, true }, { 89002, true }, - { 89012, true }, - { 89022, true }, - { 89035, true }, - { 89045, true }, - { 89057, true }, - { 89064, true }, - { 89087, true }, - { 89096, true }, - { 89111, true }, - { 89118, true }, - { 89134, true }, - { 89140, true }, - { 89152, true }, - { 89162, true }, - { 89173, true }, - { 89183, true }, - { 89190, true }, + { 89010, true }, + { 89017, true }, + { 89030, true }, + { 89041, true }, + { 89055, true }, + { 89069, true }, + { 89083, true }, + { 89093, true }, + { 89103, true }, + { 89116, true }, + { 89126, true }, + { 89138, true }, + { 89145, true }, + { 89168, true }, + { 89177, true }, + { 89192, true }, { 89199, true }, - { 89208, true }, - { 89222, true }, - { 89240, true }, - { 89256, true }, - { 89278, true }, - { 89291, true }, - { 89300, true }, - { 89314, true }, - { 89327, true }, - { 89339, true }, - { 89349, true }, - { 89362, true }, - { 89371, true }, - { 89393, true }, - { 89416, true }, - { 89431, true }, - { 89446, true }, - { 89464, true }, + { 89215, true }, + { 89221, true }, + { 89233, true }, + { 89243, true }, + { 89254, true }, + { 89264, true }, + { 89271, true }, + { 89280, true }, + { 89289, true }, + { 89303, true }, + { 89321, true }, + { 89337, true }, + { 89359, true }, + { 89372, true }, + { 89381, true }, + { 89395, true }, + { 89408, true }, + { 89420, true }, + { 89430, true }, + { 89443, true }, + { 89452, true }, { 89474, true }, - { 89493, true }, + { 89497, true }, { 89512, true }, - { 89530, true }, - { 89550, true }, - { 89560, true }, - { 89571, true }, - { 89589, true }, - { 89601, true }, - { 89612, true }, - { 89628, true }, - { 89645, true }, - { 89660, true }, - { 89676, true }, - { 89692, true }, - { 89701, true }, - { 89718, true }, - { 89730, true }, - { 89747, true }, - { 89765, true }, - { 89777, true }, - { 89794, true }, - { 89808, true }, - { 89817, true }, - { 89831, true }, + { 89527, true }, + { 89545, true }, + { 89555, true }, + { 89574, true }, + { 89593, true }, + { 89611, true }, + { 89631, true }, + { 89641, true }, + { 89652, true }, + { 89670, true }, + { 89682, true }, + { 89693, true }, + { 89709, true }, + { 89726, true }, + { 89741, true }, + { 89757, true }, + { 89773, true }, + { 89782, true }, + { 89799, true }, + { 89811, true }, + { 89828, true }, { 89846, true }, - { 89857, true }, - { 89872, true }, - { 89887, true }, - { 89902, true }, - { 89920, true }, - { 89933, true }, - { 89945, true }, - { 89962, true }, + { 89858, true }, + { 89875, true }, + { 89889, true }, + { 89898, true }, + { 89912, true }, + { 89927, true }, + { 89938, true }, + { 89953, true }, + { 89968, true }, { 89983, true }, - { 90007, true }, - { 90029, true }, - { 90042, true }, - { 90057, true }, - { 90074, true }, - { 90090, true }, - { 90104, true }, - { 90117, true }, - { 90137, true }, + { 90001, true }, + { 90014, true }, + { 90026, true }, + { 90043, true }, + { 90064, true }, + { 90088, true }, + { 90110, true }, + { 90123, true }, + { 90138, true }, { 90155, true }, - { 90176, true }, - { 90189, false }, - { 90210, true }, - { 90228, true }, - { 90251, true }, - { 90267, true }, - { 90280, true }, - { 90295, true }, - { 90312, true }, - { 90326, true }, - { 90347, true }, - { 90358, true }, - { 90383, true }, - { 90399, true }, - { 90416, true }, - { 90433, true }, - { 90445, false }, - { 90462, true }, - { 90476, true }, - { 90489, true }, - { 90504, true }, - { 90516, false }, - { 90527, true }, + { 90171, true }, + { 90185, true }, + { 90198, true }, + { 90218, true }, + { 90236, true }, + { 90257, true }, + { 90270, false }, + { 90291, true }, + { 90309, true }, + { 90332, true }, + { 90348, true }, + { 90361, true }, + { 90376, true }, + { 90393, true }, + { 90407, true }, + { 90428, true }, + { 90439, true }, + { 90464, true }, + { 90480, true }, + { 90497, true }, + { 90514, true }, + { 90526, false }, { 90543, true }, - { 90559, true }, - { 90571, true }, - { 90587, true }, - { 90601, true }, - { 90614, true }, + { 90557, true }, + { 90570, true }, + { 90585, true }, + { 90597, false }, + { 90608, true }, { 90624, true }, - { 90643, true }, + { 90640, true }, { 90652, true }, - { 90659, true }, - { 90670, true }, - { 90679, true }, - { 90696, true }, - { 90708, true }, - { 90717, true }, - { 90728, true }, - { 90741, true }, - { 90753, true }, + { 90668, true }, + { 90682, true }, + { 90695, true }, + { 90705, true }, + { 90724, true }, + { 90733, true }, + { 90740, true }, + { 90751, true }, { 90760, true }, - { 90775, false }, - { 90782, false }, - { 90791, true }, - { 90827, true }, - { 90839, true }, - { 90851, true }, - { 90862, true }, - { 90883, true }, - { 90909, true }, - { 90919, true }, - { 90928, true }, - { 90937, true }, - { 90944, true }, - { 90956, false }, - { 90968, false }, - { 90976, true }, - { 90988, true }, - { 91001, true }, - { 91015, false }, - { 91030, true }, - { 91044, true }, - { 91057, true }, - { 91069, true }, - { 91081, true }, - { 91092, true }, - { 91106, true }, - { 91126, true }, - { 91137, true }, + { 90777, true }, + { 90789, true }, + { 90798, true }, + { 90809, true }, + { 90822, true }, + { 90834, true }, + { 90841, true }, + { 90856, true }, + { 90871, true }, + { 90878, false }, + { 90885, false }, + { 90894, true }, + { 90930, true }, + { 90942, true }, + { 90954, true }, + { 90965, true }, + { 90986, true }, + { 91012, true }, + { 91022, true }, + { 91031, true }, + { 91040, true }, + { 91047, true }, + { 91059, false }, + { 91071, false }, + { 91079, true }, + { 91091, true }, + { 91104, true }, + { 91118, false }, + { 91133, true }, { 91147, true }, - { 91155, true }, - { 91168, true }, - { 91180, true }, - { 91191, true }, - { 91203, true }, - { 91220, true }, - { 91230, true }, - { 91240, false }, + { 91160, true }, + { 91172, true }, + { 91184, true }, + { 91195, true }, + { 91209, true }, + { 91229, true }, + { 91240, true }, + { 91250, true }, { 91258, true }, - { 91276, true }, - { 91298, true }, - { 91320, true }, - { 91331, true }, - { 91343, true }, - { 91358, true }, - { 91374, true }, - { 91385, true }, + { 91271, true }, + { 91283, true }, + { 91294, true }, + { 91306, true }, + { 91323, true }, + { 91333, true }, + { 91343, false }, + { 91361, true }, + { 91379, true }, { 91401, true }, - { 91425, true }, - { 91448, true }, - { 91466, true }, + { 91423, true }, + { 91434, true }, + { 91446, true }, + { 91461, true }, { 91477, true }, - { 91498, true }, - { 91516, true }, - { 91529, true }, - { 91556, true }, - { 91576, true }, - { 91588, true }, - { 91606, true }, - { 91620, true }, - { 91636, true }, - { 91652, true }, - { 91666, true }, + { 91488, true }, + { 91504, true }, + { 91528, true }, + { 91551, true }, + { 91569, true }, + { 91580, true }, + { 91601, true }, + { 91619, true }, + { 91632, true }, + { 91659, true }, { 91679, true }, - { 91693, true }, - { 91707, true }, - { 91731, true }, - { 91759, false }, - { 91770, true }, - { 91781, true }, - { 91799, true }, - { 91817, true }, - { 91838, true }, + { 91691, true }, + { 91709, true }, + { 91723, true }, + { 91739, true }, + { 91755, true }, + { 91768, true }, + { 91782, true }, + { 91796, true }, + { 91820, true }, + { 91848, false }, { 91859, true }, - { 91880, true }, - { 91894, true }, - { 91907, true }, - { 91929, true }, - { 91940, true }, - { 91959, true }, - { 91977, true }, - { 91987, true }, - { 92005, true }, - { 92024, true }, - { 92042, true }, - { 92063, true }, - { 92084, true }, - { 92104, true }, - { 92114, true }, - { 92136, true }, + { 91870, true }, + { 91888, true }, + { 91906, true }, + { 91927, true }, + { 91948, true }, + { 91969, true }, + { 91983, true }, + { 91996, true }, + { 92018, true }, + { 92029, true }, + { 92048, true }, + { 92066, true }, + { 92076, true }, + { 92094, true }, + { 92113, true }, + { 92131, true }, { 92152, true }, { 92173, true }, - { 92189, true }, - { 92200, true }, - { 92211, true }, - { 92221, true }, - { 92231, true }, - { 92248, true }, - { 92262, false }, - { 92275, true }, - { 92287, true }, - { 92298, true }, - { 92315, true }, - { 92325, true }, - { 92339, true }, - { 92358, true }, + { 92193, true }, + { 92203, true }, + { 92225, true }, + { 92241, true }, + { 92262, true }, + { 92278, true }, + { 92289, true }, + { 92300, true }, + { 92310, true }, + { 92320, true }, + { 92337, true }, + { 92351, false }, + { 92364, true }, { 92376, true }, - { 92396, true }, - { 92407, true }, - { 92420, true }, - { 92436, true }, - { 92449, true }, - { 92459, true }, - { 92474, true }, - { 92488, true }, - { 92500, true }, - { 92514, true }, - { 92526, true }, - { 92544, true }, - { 92559, true }, - { 92572, true }, + { 92387, true }, + { 92404, true }, + { 92414, true }, + { 92428, true }, + { 92447, true }, + { 92465, true }, + { 92485, true }, + { 92496, true }, + { 92509, true }, + { 92525, true }, + { 92538, true }, + { 92548, true }, + { 92563, true }, + { 92577, true }, { 92589, true }, - { 92606, true }, - { 92620, true }, + { 92603, true }, + { 92615, true }, { 92633, true }, - { 92647, true }, - { 92659, true }, - { 92668, true }, - { 92687, true }, - { 92698, false }, + { 92648, true }, + { 92661, true }, + { 92678, true }, + { 92695, true }, { 92709, true }, - { 92719, true }, - { 92730, true }, - { 92743, true }, + { 92722, true }, + { 92736, true }, + { 92748, true }, { 92757, true }, - { 92767, true }, - { 92784, true }, - { 92793, true }, - { 92807, true }, - { 92815, true }, - { 92822, true }, - { 92829, true }, - { 92838, true }, - { 92857, true }, - { 92872, true }, - { 92885, true }, - { 92906, true }, - { 92926, true }, - { 92945, true }, - { 92962, true }, - { 92978, true }, - { 92998, true }, - { 93008, true }, - { 93027, true }, - { 93048, true }, - { 93065, true }, - { 93078, true }, - { 93091, true }, - { 93105, true }, - { 93115, true }, - { 93130, true }, - { 93142, true }, - { 93158, false }, - { 93172, false }, - { 93185, false }, - { 93192, true }, - { 93200, true }, - { 93212, true }, - { 93222, true }, - { 93237, true }, - { 93252, true }, - { 93274, true }, - { 93293, true }, - { 93305, true }, - { 93317, true }, - { 93328, true }, - { 93343, true }, - { 93359, true }, - { 93377, true }, - { 93395, true }, - { 93403, true }, - { 93423, true }, - { 93437, true }, - { 93447, true }, - { 93457, true }, - { 93470, true }, - { 93477, true }, - { 93488, true }, - { 93497, true }, - { 93509, false }, - { 93529, false }, - { 93545, true }, - { 93556, true }, - { 93571, true }, - { 93584, true }, - { 93597, true }, - { 93609, true }, - { 93622, true }, - { 93639, false }, - { 93650, false }, + { 92776, true }, + { 92787, false }, + { 92798, true }, + { 92808, true }, + { 92819, true }, + { 92832, true }, + { 92846, true }, + { 92856, true }, + { 92873, true }, + { 92882, true }, + { 92896, true }, + { 92904, true }, + { 92911, true }, + { 92918, true }, + { 92927, true }, + { 92946, true }, + { 92961, true }, + { 92974, true }, + { 92995, true }, + { 93015, true }, + { 93034, true }, + { 93051, true }, + { 93067, true }, + { 93087, true }, + { 93097, true }, + { 93116, true }, + { 93137, true }, + { 93154, true }, + { 93167, true }, + { 93180, true }, + { 93194, true }, + { 93204, true }, + { 93219, true }, + { 93231, true }, + { 93247, false }, + { 93261, false }, + { 93274, false }, + { 93281, true }, + { 93289, true }, + { 93301, true }, + { 93311, true }, + { 93326, true }, + { 93341, true }, + { 93363, true }, + { 93382, true }, + { 93394, true }, + { 93406, true }, + { 93417, true }, + { 93432, true }, + { 93448, true }, + { 93466, true }, + { 93484, true }, + { 93492, true }, + { 93512, true }, + { 93526, true }, + { 93536, true }, + { 93546, true }, + { 93559, true }, + { 93566, true }, + { 93577, true }, + { 93586, true }, + { 93598, false }, + { 93618, false }, + { 93634, true }, + { 93645, true }, { 93660, true }, - { 93675, true }, - { 93690, true }, - { 93706, true }, - { 93725, true }, - { 93739, true }, - { 93756, true }, - { 93782, true }, + { 93673, true }, + { 93686, true }, + { 93698, true }, + { 93711, true }, + { 93728, false }, + { 93739, false }, + { 93749, true }, + { 93764, true }, + { 93779, true }, { 93795, true }, - { 93810, true }, - { 93825, true }, - { 93840, true }, - { 93854, true }, - { 93873, true }, - { 93890, true }, - { 93906, true }, - { 93927, true }, - { 93944, true }, - { 93978, true }, - { 94002, true }, - { 94031, true }, - { 94055, true }, - { 94071, true }, - { 94096, true }, - { 94108, true }, - { 94122, true }, - { 94140, true }, - { 94149, false }, - { 94159, true }, - { 94171, true }, - { 94186, true }, - { 94194, true }, - { 94203, true }, + { 93814, true }, + { 93828, true }, + { 93845, true }, + { 93871, true }, + { 93884, true }, + { 93899, true }, + { 93914, true }, + { 93929, true }, + { 93943, true }, + { 93962, true }, + { 93979, true }, + { 93995, true }, + { 94016, true }, + { 94033, true }, + { 94067, true }, + { 94091, true }, + { 94120, true }, + { 94144, true }, + { 94160, true }, + { 94185, true }, + { 94197, true }, { 94211, true }, - { 94225, true }, - { 94233, true }, - { 94249, true }, - { 94271, true }, + { 94229, true }, + { 94238, false }, + { 94248, true }, + { 94260, true }, + { 94275, true }, { 94283, true }, - { 94295, true }, - { 94303, true }, + { 94292, true }, + { 94300, true }, { 94314, true }, - { 94324, true }, - { 94334, false }, - { 94346, true }, - { 94362, true }, - { 94378, true }, + { 94322, true }, + { 94338, true }, + { 94360, true }, + { 94372, true }, + { 94384, true }, { 94392, true }, - { 94408, true }, - { 94420, true }, + { 94403, true }, + { 94413, true }, + { 94423, false }, { 94435, true }, - { 94449, true }, - { 94460, true }, - { 94475, true }, - { 94493, true }, - { 94508, true }, - { 94519, false }, - { 94531, true }, - { 94545, true }, - { 94556, true }, - { 94567, true }, - { 94578, true }, - { 94588, true }, - { 94605, true }, - { 94622, true }, - { 94640, true }, - { 94650, true }, - { 94673, true }, - { 94687, true }, - { 94703, true }, - { 94722, true }, - { 94735, true }, - { 94752, true }, - { 94770, false }, - { 94783, true }, - { 94804, true }, - { 94818, true }, - { 94828, true }, - { 94839, true }, - { 94846, false }, - { 94855, true }, - { 94871, true }, - { 94887, true }, - { 94894, true }, - { 94915, true }, - { 94925, false }, - { 94940, true }, - { 94955, true }, - { 94972, true }, - { 94982, true }, - { 95001, true }, - { 95016, true }, - { 95025, true }, - { 95034, true }, - { 95046, true }, - { 95065, true }, - { 95083, true }, - { 95093, true }, - { 95103, true }, - { 95116, true }, - { 95124, true }, + { 94451, true }, + { 94467, true }, + { 94481, true }, + { 94497, true }, + { 94509, true }, + { 94524, true }, + { 94538, true }, + { 94549, true }, + { 94564, true }, + { 94582, true }, + { 94597, true }, + { 94608, false }, + { 94620, true }, + { 94634, true }, + { 94645, true }, + { 94656, true }, + { 94667, true }, + { 94677, true }, + { 94694, true }, + { 94711, true }, + { 94729, true }, + { 94739, true }, + { 94762, true }, + { 94776, true }, + { 94792, true }, + { 94811, true }, + { 94824, true }, + { 94841, true }, + { 94859, false }, + { 94872, true }, + { 94893, true }, + { 94907, true }, + { 94917, true }, + { 94928, true }, + { 94935, false }, + { 94944, true }, + { 94960, true }, + { 94976, true }, + { 94983, true }, + { 95004, true }, + { 95014, false }, + { 95029, true }, + { 95044, true }, + { 95061, true }, + { 95071, true }, + { 95090, true }, + { 95105, true }, + { 95114, true }, + { 95123, true }, { 95135, true }, - { 95150, true }, - { 95161, true }, - { 95177, true }, - { 95190, true }, - { 95200, true }, - { 95219, true }, - { 95235, true }, - { 95257, true }, - { 95269, true }, - { 95282, false }, - { 95296, true }, - { 95311, true }, - { 95325, true }, - { 95340, true }, - { 95356, true }, - { 95368, true }, - { 95379, false }, - { 95392, true }, - { 95404, true }, + { 95154, true }, + { 95172, true }, + { 95182, true }, + { 95192, true }, + { 95205, true }, + { 95213, true }, + { 95224, true }, + { 95239, true }, + { 95250, true }, + { 95266, true }, + { 95279, true }, + { 95289, true }, + { 95308, true }, + { 95324, true }, + { 95346, true }, + { 95358, true }, + { 95371, false }, + { 95385, true }, + { 95400, true }, { 95414, true }, - { 95431, true }, - { 95444, true }, - { 95463, true }, - { 95479, true }, - { 95491, false }, - { 95501, true }, - { 95517, true }, - { 95528, true }, - { 95548, false }, - { 95556, true }, + { 95429, true }, + { 95445, true }, + { 95457, true }, + { 95468, false }, + { 95481, true }, + { 95493, true }, + { 95503, true }, + { 95520, true }, + { 95533, true }, + { 95552, true }, { 95568, true }, - { 95579, true }, - { 95591, true }, - { 95610, false }, - { 95630, true }, - { 95639, true }, - { 95650, true }, - { 95681, true }, - { 95695, true }, - { 95709, true }, - { 95729, true }, - { 95743, true }, - { 95767, true }, - { 95783, true }, + { 95580, false }, + { 95590, true }, + { 95606, true }, + { 95617, true }, + { 95637, false }, + { 95645, true }, + { 95657, true }, + { 95668, true }, + { 95680, true }, + { 95699, false }, + { 95719, true }, + { 95728, true }, + { 95739, true }, + { 95770, true }, + { 95784, true }, { 95798, true }, - { 95812, true }, - { 95826, true }, - { 95834, true }, - { 95847, true }, - { 95858, true }, - { 95870, true }, - { 95882, true }, - { 95898, true }, - { 95909, true }, - { 95924, true }, - { 95934, true }, + { 95818, true }, + { 95832, true }, + { 95856, true }, + { 95872, true }, + { 95887, true }, + { 95901, true }, + { 95915, true }, + { 95923, true }, + { 95936, true }, + { 95947, true }, { 95959, true }, - { 95975, true }, - { 95991, true }, + { 95971, true }, + { 95987, true }, + { 95998, true }, { 96013, true }, - { 96029, true }, + { 96023, true }, { 96048, true }, - { 96072, true }, - { 96088, true }, - { 96104, true }, - { 96114, true }, - { 96126, true }, - { 96143, true }, + { 96064, true }, + { 96080, true }, + { 96102, true }, + { 96118, true }, + { 96137, true }, { 96161, true }, - { 96173, true }, - { 96187, true }, - { 96202, true }, - { 96222, true }, - { 96242, true }, + { 96177, true }, + { 96193, true }, + { 96203, true }, + { 96215, true }, + { 96232, true }, + { 96250, true }, { 96262, true }, - { 96283, false }, - { 96299, true }, - { 96317, true }, - { 96332, true }, - { 96348, true }, - { 96363, true }, - { 96375, true }, - { 96394, false }, - { 96402, true }, - { 96416, true }, - { 96433, true }, - { 96447, true }, - { 96461, true }, - { 96473, true }, - { 96487, true }, - { 96500, true }, - { 96518, true }, - { 96532, true }, - { 96548, true }, - { 96568, true }, - { 96599, true }, - { 96630, true }, - { 96652, true }, - { 96670, true }, - { 96684, true }, - { 96706, true }, - { 96721, true }, - { 96740, true }, - { 96750, true }, - { 96765, true }, - { 96780, true }, + { 96276, true }, + { 96291, true }, + { 96311, true }, + { 96331, true }, + { 96351, true }, + { 96372, false }, + { 96388, true }, + { 96406, true }, + { 96421, true }, + { 96437, true }, + { 96452, true }, + { 96464, true }, + { 96483, false }, + { 96491, true }, + { 96505, true }, + { 96522, true }, + { 96536, true }, + { 96550, true }, + { 96562, true }, + { 96576, true }, + { 96589, true }, + { 96607, true }, + { 96621, true }, + { 96637, true }, + { 96657, true }, + { 96688, true }, + { 96719, true }, + { 96741, true }, + { 96759, true }, + { 96773, true }, { 96795, true }, - { 96812, true }, - { 96825, true }, - { 96840, true }, - { 96853, true }, - { 96866, true }, - { 96876, true }, - { 96899, true }, - { 96910, true }, - { 96922, true }, - { 96933, true }, - { 96950, true }, - { 96967, true }, - { 96982, true }, - { 96989, true }, - { 97002, true }, - { 97015, true }, - { 97025, true }, - { 97042, true }, - { 97052, true }, - { 97062, true }, + { 96810, true }, + { 96829, true }, + { 96839, true }, + { 96854, true }, + { 96869, true }, + { 96884, true }, + { 96901, true }, + { 96914, true }, + { 96929, true }, + { 96942, true }, + { 96955, true }, + { 96965, true }, + { 96988, true }, + { 96999, true }, + { 97011, true }, + { 97022, true }, + { 97039, true }, + { 97056, true }, { 97071, true }, - { 97081, true }, - { 97100, true }, - { 97118, true }, - { 97139, true }, - { 97159, true }, - { 97172, true }, + { 97078, true }, + { 97091, true }, + { 97104, true }, + { 97114, true }, + { 97131, true }, + { 97141, true }, + { 97151, true }, + { 97160, true }, + { 97170, true }, { 97189, true }, - { 97202, true }, - { 97224, true }, - { 97236, true }, - { 97246, true }, - { 97259, true }, - { 97273, true }, - { 97295, true }, - { 97312, true }, - { 97320, true }, - { 97332, true }, - { 97345, true }, - { 97360, true }, - { 97379, true }, - { 97389, true }, - { 97400, true }, - { 97412, true }, - { 97433, true }, - { 97444, true }, - { 97453, true }, - { 97463, true }, - { 97483, true }, - { 97500, true }, - { 97519, true }, - { 97541, true }, - { 97553, true }, - { 97571, true }, - { 97584, true }, - { 97595, true }, - { 97610, true }, - { 97623, true }, - { 97646, true }, + { 97207, true }, + { 97228, true }, + { 97248, true }, + { 97261, true }, + { 97278, true }, + { 97291, true }, + { 97313, true }, + { 97325, true }, + { 97335, true }, + { 97348, true }, + { 97362, true }, + { 97384, true }, + { 97401, true }, + { 97409, true }, + { 97421, true }, + { 97434, true }, + { 97449, true }, + { 97468, true }, + { 97478, true }, + { 97489, true }, + { 97501, true }, + { 97522, true }, + { 97533, true }, + { 97542, true }, + { 97552, true }, + { 97572, true }, + { 97589, true }, + { 97608, true }, + { 97630, true }, + { 97642, true }, { 97660, true }, - { 97670, true }, + { 97673, true }, { 97684, true }, - { 97700, true }, - { 97715, true }, - { 97727, true }, - { 97737, true }, - { 97745, true }, - { 97761, true }, - { 97779, true }, - { 97793, true }, - { 97801, true }, - { 97809, true }, - { 97820, true }, + { 97699, true }, + { 97712, true }, + { 97735, true }, + { 97749, true }, + { 97759, true }, + { 97773, true }, + { 97789, true }, + { 97804, true }, + { 97816, true }, + { 97826, true }, { 97834, true }, - { 97846, true }, - { 97858, true }, - { 97871, true }, - { 97881, true }, - { 97892, false }, - { 97908, true }, - { 97921, true }, - { 97936, true }, + { 97850, true }, + { 97868, true }, + { 97882, true }, + { 97890, true }, + { 97898, true }, + { 97909, true }, + { 97923, true }, + { 97935, true }, { 97947, true }, - { 97963, true }, - { 97981, true }, - { 97998, true }, - { 98019, true }, - { 98031, true }, - { 98040, true }, - { 98053, false }, - { 98071, true }, - { 98079, true }, - { 98090, true }, - { 98102, true }, - { 98112, false }, - { 98130, true }, - { 98148, true }, - { 98167, true }, - { 98186, true }, - { 98217, true }, - { 98231, true }, - { 98251, false }, - { 98271, false }, - { 98283, true }, - { 98296, true }, - { 98315, true }, - { 98329, true }, - { 98341, true }, - { 98354, true }, - { 98369, true }, - { 98379, true }, - { 98389, true }, - { 98399, true }, - { 98411, true }, - { 98426, true }, - { 98441, true }, - { 98450, true }, + { 97960, true }, + { 97970, true }, + { 97981, false }, + { 97997, true }, + { 98010, true }, + { 98025, true }, + { 98036, true }, + { 98052, true }, + { 98070, true }, + { 98087, true }, + { 98108, true }, + { 98120, true }, + { 98129, true }, + { 98142, false }, + { 98160, true }, + { 98168, true }, + { 98179, true }, + { 98191, true }, + { 98201, false }, + { 98219, true }, + { 98237, true }, + { 98256, true }, + { 98275, true }, + { 98306, true }, + { 98320, true }, + { 98340, false }, + { 98360, false }, + { 98372, true }, + { 98385, true }, + { 98404, true }, + { 98418, true }, + { 98430, true }, + { 98443, true }, { 98458, true }, - { 98471, true }, - { 98481, true }, - { 98491, true }, - { 98518, true }, - { 98526, true }, - { 98543, true }, - { 98555, true }, - { 98572, true }, - { 98593, true }, - { 98608, true }, + { 98468, true }, + { 98478, true }, + { 98488, true }, + { 98500, true }, + { 98515, true }, + { 98530, true }, + { 98539, true }, + { 98547, true }, + { 98560, true }, + { 98570, true }, + { 98597, true }, + { 98605, true }, { 98622, true }, - { 98632, true }, - { 98640, true }, - { 98649, true }, - { 98658, true }, - { 98675, true }, + { 98634, true }, + { 98651, true }, + { 98672, true }, { 98687, true }, - { 98695, true }, - { 98713, true }, - { 98734, true }, - { 98753, true }, - { 98767, true }, - { 98779, true }, - { 98797, true }, - { 98809, true }, - { 98820, true }, - { 98827, true }, - { 98839, true }, - { 98848, true }, - { 98857, true }, - { 98873, true }, - { 98880, true }, + { 98701, true }, + { 98711, true }, + { 98719, true }, + { 98728, true }, + { 98737, true }, + { 98754, true }, + { 98766, true }, + { 98774, true }, + { 98792, true }, + { 98813, true }, + { 98832, true }, + { 98846, true }, + { 98858, true }, + { 98876, true }, { 98888, true }, - { 98902, false }, - { 98913, true }, - { 98924, true }, - { 98939, true }, - { 98949, true }, - { 98962, true }, - { 98974, true }, - { 98985, true }, - { 98995, false }, - { 99005, true }, - { 99019, true }, - { 99033, true }, - { 99053, true }, - { 99068, true }, - { 99079, true }, - { 99092, true }, - { 99104, true }, - { 99119, true }, - { 99132, true }, - { 99159, true }, - { 99173, true }, - { 99187, true }, - { 99204, true }, + { 98899, true }, + { 98906, true }, + { 98918, true }, + { 98927, true }, + { 98936, true }, + { 98952, true }, + { 98959, true }, + { 98967, false }, + { 98978, true }, + { 98989, true }, + { 99004, true }, + { 99014, true }, + { 99027, true }, + { 99039, true }, + { 99050, true }, + { 99060, false }, + { 99070, true }, + { 99084, true }, + { 99098, true }, + { 99118, true }, + { 99133, true }, + { 99144, true }, + { 99157, true }, + { 99169, true }, + { 99184, true }, + { 99197, true }, { 99224, true }, - { 99239, true }, - { 99249, true }, - { 99262, true }, - { 99279, true }, - { 99292, true }, - { 99302, true }, - { 99329, true }, - { 99339, true }, - { 99352, true }, - { 99361, true }, - { 99368, true }, - { 99384, true }, - { 99396, true }, - { 99407, true }, - { 99418, true }, - { 99432, true }, - { 99443, true }, - { 99453, true }, - { 99474, true }, - { 99484, true }, - { 99495, true }, - { 99515, true }, - { 99527, true }, - { 99550, true }, - { 99564, true }, - { 99583, true }, - { 99600, true }, - { 99608, true }, - { 99636, true }, - { 99647, true }, - { 99658, true }, - { 99676, true }, - { 99686, true }, - { 99695, true }, - { 99711, true }, - { 99727, true }, - { 99736, true }, - { 99754, true }, - { 99786, true }, - { 99805, true }, - { 99821, true }, - { 99841, true }, - { 99862, true }, - { 99879, true }, - { 99893, true }, - { 99904, true }, - { 99924, true }, - { 99936, true }, - { 99957, true }, - { 99971, true }, - { 99990, true }, - { 100008, true }, - { 100019, true }, - { 100027, true }, + { 99238, true }, + { 99252, true }, + { 99269, true }, + { 99289, true }, + { 99304, true }, + { 99314, true }, + { 99327, true }, + { 99344, true }, + { 99357, true }, + { 99367, true }, + { 99394, true }, + { 99404, true }, + { 99417, true }, + { 99426, true }, + { 99433, true }, + { 99449, true }, + { 99461, true }, + { 99472, true }, + { 99483, true }, + { 99497, true }, + { 99508, true }, + { 99518, true }, + { 99539, true }, + { 99549, true }, + { 99560, true }, + { 99580, true }, + { 99592, true }, + { 99615, true }, + { 99629, true }, + { 99648, true }, + { 99665, true }, + { 99673, true }, + { 99701, true }, + { 99712, true }, + { 99723, true }, + { 99741, true }, + { 99751, true }, + { 99760, true }, + { 99776, true }, + { 99792, true }, + { 99801, true }, + { 99819, true }, + { 99851, true }, + { 99870, true }, + { 99886, true }, + { 99906, true }, + { 99927, true }, + { 99944, true }, + { 99958, true }, + { 99969, true }, + { 99989, true }, + { 100001, true }, + { 100022, true }, { 100036, true }, - { 100048, true }, - { 100062, true }, - { 100074, true }, - { 100087, true }, - { 100098, true }, - { 100110, true }, - { 100120, true }, - { 100143, false }, - { 100158, true }, - { 100173, true }, - { 100192, true }, - { 100210, true }, - { 100224, true }, + { 100055, true }, + { 100073, true }, + { 100084, true }, + { 100092, true }, + { 100101, true }, + { 100113, true }, + { 100127, true }, + { 100139, true }, + { 100152, true }, + { 100163, true }, + { 100175, true }, + { 100185, true }, + { 100208, false }, + { 100223, true }, { 100238, true }, - { 100248, true }, - { 100261, true }, - { 100274, true }, + { 100257, true }, + { 100275, true }, { 100289, true }, - { 100301, true }, - { 100315, true }, - { 100331, true }, - { 100346, true }, - { 100355, true }, - { 100371, true }, - { 100389, true }, - { 100400, true }, - { 100427, true }, - { 100442, true }, - { 100455, true }, - { 100471, true }, - { 100488, false }, - { 100505, true }, - { 100527, true }, - { 100549, true }, - { 100571, true }, - { 100585, true }, - { 100597, true }, - { 100611, true }, - { 100622, true }, - { 100637, true }, + { 100303, true }, + { 100313, true }, + { 100326, true }, + { 100339, true }, + { 100354, true }, + { 100366, true }, + { 100380, true }, + { 100396, true }, + { 100411, true }, + { 100420, true }, + { 100436, true }, + { 100454, true }, + { 100465, true }, + { 100492, true }, + { 100507, true }, + { 100520, true }, + { 100536, true }, + { 100553, false }, + { 100570, true }, + { 100592, true }, + { 100614, true }, + { 100636, true }, { 100650, true }, - { 100659, true }, - { 100675, true }, - { 100692, true }, - { 100703, true }, - { 100717, true }, - { 100730, true }, - { 100744, true }, - { 100758, true }, - { 100770, true }, + { 100662, true }, + { 100676, true }, + { 100687, true }, + { 100702, true }, + { 100715, true }, + { 100724, true }, + { 100740, true }, + { 100757, true }, + { 100768, true }, { 100782, true }, { 100795, true }, - { 100808, true }, - { 100818, true }, - { 100832, false }, - { 100844, true }, - { 100857, true }, - { 100879, true }, - { 100901, true }, - { 100912, false }, - { 100927, true }, - { 100938, false }, - { 100958, true }, - { 100978, true }, - { 100995, true }, - { 101014, true }, - { 101032, true }, - { 101051, true }, - { 101063, true }, - { 101084, true }, - { 101109, true }, - { 101121, true }, - { 101140, true }, - { 101155, true }, - { 101175, false }, - { 101183, true }, - { 101195, true }, - { 101213, true }, - { 101230, true }, - { 101242, true }, - { 101256, true }, - { 101266, true }, - { 101279, true }, - { 101297, true }, - { 101304, true }, - { 101318, true }, - { 101325, true }, - { 101332, true }, + { 100809, true }, + { 100823, true }, + { 100835, true }, + { 100847, true }, + { 100860, true }, + { 100873, true }, + { 100883, true }, + { 100897, false }, + { 100909, true }, + { 100922, true }, + { 100944, true }, + { 100966, true }, + { 100977, false }, + { 100992, true }, + { 101003, false }, + { 101023, true }, + { 101043, true }, + { 101060, true }, + { 101079, true }, + { 101097, true }, + { 101116, true }, + { 101128, true }, + { 101149, true }, + { 101174, true }, + { 101186, true }, + { 101205, true }, + { 101220, true }, + { 101240, false }, + { 101248, true }, + { 101260, true }, + { 101278, true }, + { 101295, true }, + { 101307, true }, + { 101321, true }, + { 101331, true }, { 101344, true }, - { 101355, true }, - { 101368, true }, - { 101382, true }, - { 101399, true }, - { 101413, true }, - { 101429, true }, - { 101440, true }, + { 101362, true }, + { 101369, true }, + { 101383, true }, + { 101390, true }, + { 101397, true }, + { 101409, true }, + { 101420, true }, + { 101433, true }, { 101447, true }, - { 101460, true }, - { 101473, true }, - { 101482, true }, - { 101496, true }, - { 101510, true }, - { 101526, false }, - { 101541, true }, - { 101569, true }, - { 101584, true }, - { 101605, true }, - { 101619, true }, - { 101633, true }, - { 101654, true }, + { 101464, true }, + { 101478, true }, + { 101494, true }, + { 101505, true }, + { 101512, true }, + { 101525, true }, + { 101538, true }, + { 101547, true }, + { 101561, true }, + { 101575, true }, + { 101591, false }, + { 101606, true }, + { 101634, true }, + { 101649, true }, { 101670, true }, - { 101685, true }, - { 101697, true }, - { 101707, true }, - { 101718, true }, - { 101728, true }, - { 101741, true }, - { 101751, true }, - { 101764, true }, - { 101784, true }, - { 101803, true }, - { 101822, true }, - { 101842, true }, - { 101860, true }, - { 101871, true }, - { 101888, true }, - { 101900, true }, - { 101912, true }, - { 101937, true }, - { 101948, true }, - { 101963, true }, - { 101981, true }, - { 101993, true }, - { 102008, true }, - { 102034, true }, + { 101684, true }, + { 101698, true }, + { 101719, true }, + { 101735, true }, + { 101750, true }, + { 101762, true }, + { 101772, true }, + { 101783, true }, + { 101793, true }, + { 101806, true }, + { 101816, true }, + { 101829, true }, + { 101846, true }, + { 101866, true }, + { 101885, true }, + { 101904, true }, + { 101924, true }, + { 101942, true }, + { 101953, true }, + { 101970, true }, + { 101982, true }, + { 101994, true }, + { 102019, true }, + { 102030, true }, { 102045, true }, - { 102056, true }, - { 102067, true }, - { 102079, true }, + { 102063, true }, + { 102075, true }, { 102090, true }, - { 102100, true }, - { 102114, true }, + { 102116, true }, { 102127, true }, - { 102136, true }, - { 102145, true }, - { 102158, true }, - { 102165, false }, - { 102173, true }, - { 102181, true }, - { 102194, true }, - { 102205, true }, - { 102219, true }, - { 102233, false }, - { 102245, true }, - { 102259, true }, - { 102283, true }, - { 102298, true }, - { 102311, true }, - { 102325, true }, - { 102343, true }, - { 102358, true }, - { 102366, true }, - { 102383, true }, - { 102408, true }, - { 102428, true }, - { 102452, true }, - { 102464, true }, - { 102475, true }, - { 102488, true }, - { 102504, true }, - { 102518, true }, - { 102527, true }, - { 102543, true }, - { 102561, true }, - { 102576, true }, - { 102596, true }, + { 102138, true }, + { 102149, true }, + { 102161, true }, + { 102172, true }, + { 102182, true }, + { 102196, true }, + { 102209, true }, + { 102218, true }, + { 102227, true }, + { 102240, true }, + { 102247, false }, + { 102255, true }, + { 102263, true }, + { 102276, true }, + { 102287, true }, + { 102301, true }, + { 102315, false }, + { 102327, true }, + { 102341, true }, + { 102365, true }, + { 102380, true }, + { 102393, true }, + { 102407, true }, + { 102425, true }, + { 102440, true }, + { 102448, true }, + { 102465, true }, + { 102490, true }, + { 102510, true }, + { 102534, true }, + { 102546, true }, + { 102557, true }, + { 102570, true }, + { 102586, true }, + { 102600, true }, { 102609, true }, { 102625, true }, - { 102639, true }, - { 102655, true }, - { 102675, true }, - { 102693, true }, - { 102712, true }, - { 102729, true }, - { 102740, true }, - { 102756, true }, - { 102766, true }, - { 102795, true }, - { 102815, true }, - { 102832, true }, - { 102849, true }, - { 102865, true }, - { 102874, true }, - { 102887, true }, - { 102899, false }, - { 102913, true }, - { 102930, true }, + { 102643, true }, + { 102658, true }, + { 102678, true }, + { 102691, true }, + { 102707, true }, + { 102721, true }, + { 102737, true }, + { 102757, true }, + { 102775, true }, + { 102794, true }, + { 102811, true }, + { 102822, true }, + { 102838, true }, + { 102848, true }, + { 102877, true }, + { 102897, true }, + { 102914, true }, + { 102931, true }, { 102947, true }, - { 102980, true }, - { 103000, true }, + { 102956, true }, + { 102969, true }, + { 102981, false }, + { 102995, true }, { 103012, true }, - { 103026, true }, - { 103039, true }, - { 103052, true }, - { 103067, true }, - { 103078, true }, - { 103095, true }, - { 103107, true }, - { 103119, true }, - { 103131, true }, - { 103140, true }, - { 103152, true }, - { 103169, true }, - { 103183, true }, - { 103204, true }, - { 103218, true }, + { 103029, true }, + { 103062, true }, + { 103082, true }, + { 103094, true }, + { 103108, true }, + { 103121, true }, + { 103134, true }, + { 103149, true }, + { 103160, true }, + { 103177, true }, + { 103189, true }, + { 103201, true }, + { 103213, true }, + { 103222, true }, { 103234, true }, - { 103249, true }, - { 103263, true }, - { 103281, true }, - { 103302, true }, + { 103251, true }, + { 103265, true }, + { 103286, true }, + { 103300, true }, { 103316, true }, - { 103330, true }, - { 103341, true }, - { 103352, true }, - { 103368, true }, - { 103380, true }, - { 103391, true }, - { 103405, true }, - { 103414, true }, + { 103331, true }, + { 103345, true }, + { 103363, true }, + { 103384, true }, + { 103398, true }, + { 103412, true }, { 103423, true }, - { 103438, true }, - { 103447, true }, - { 103460, true }, - { 103468, true }, - { 103479, true }, - { 103490, true }, - { 103504, true }, - { 103519, true }, - { 103533, true }, - { 103543, true }, - { 103554, true }, - { 103564, true }, - { 103574, true }, - { 103582, true }, - { 103591, true }, - { 103603, true }, - { 103612, true }, - { 103635, true }, - { 103650, true }, - { 103666, true }, - { 103681, true }, - { 103689, true }, - { 103699, true }, - { 103711, true }, - { 103723, true }, - { 103738, true }, - { 103751, true }, - { 103775, true }, - { 103785, false }, - { 103794, false }, - { 103803, false }, - { 103812, true }, - { 103829, true }, - { 103844, true }, - { 103863, true }, - { 103886, true }, - { 103901, true }, - { 103920, true }, - { 103930, true }, - { 103945, true }, - { 103959, true }, - { 103974, true }, - { 103993, true }, - { 104006, true }, - { 104022, true }, - { 104039, true }, - { 104055, true }, - { 104070, true }, - { 104080, true }, - { 104096, true }, - { 104114, true }, - { 104133, true }, - { 104148, true }, - { 104167, true }, - { 104178, true }, - { 104196, true }, - { 104210, true }, - { 104227, true }, - { 104235, true }, - { 104249, true }, + { 103434, true }, + { 103450, true }, + { 103462, true }, + { 103473, true }, + { 103487, true }, + { 103496, true }, + { 103505, true }, + { 103520, true }, + { 103529, true }, + { 103542, true }, + { 103550, true }, + { 103561, true }, + { 103572, true }, + { 103586, true }, + { 103601, true }, + { 103615, true }, + { 103625, true }, + { 103636, true }, + { 103646, true }, + { 103656, true }, + { 103664, true }, + { 103673, true }, + { 103685, true }, + { 103694, true }, + { 103717, true }, + { 103732, true }, + { 103748, true }, + { 103763, true }, + { 103771, true }, + { 103784, true }, + { 103794, true }, + { 103806, true }, + { 103818, true }, + { 103833, true }, + { 103846, true }, + { 103870, true }, + { 103880, false }, + { 103889, false }, + { 103898, false }, + { 103907, true }, + { 103924, true }, + { 103939, true }, + { 103958, true }, + { 103981, true }, + { 103996, true }, + { 104015, true }, + { 104030, true }, + { 104044, true }, + { 104059, true }, + { 104078, true }, + { 104091, true }, + { 104107, true }, + { 104124, true }, + { 104140, true }, + { 104155, true }, + { 104165, true }, + { 104181, true }, + { 104199, true }, + { 104218, true }, + { 104233, true }, + { 104252, true }, { 104263, true }, - { 104277, true }, - { 104294, false }, - { 104314, true }, - { 104327, true }, - { 104339, true }, - { 104354, true }, - { 104372, true }, - { 104383, true }, - { 104395, true }, - { 104405, true }, - { 104415, true }, - { 104429, true }, - { 104438, true }, - { 104451, true }, - { 104467, true }, - { 104482, true }, - { 104507, true }, - { 104533, true }, - { 104548, true }, - { 104560, true }, - { 104585, true }, + { 104281, true }, + { 104295, true }, + { 104312, true }, + { 104320, true }, + { 104334, true }, + { 104348, true }, + { 104362, true }, + { 104379, false }, + { 104399, true }, + { 104412, true }, + { 104424, true }, + { 104439, true }, + { 104457, true }, + { 104468, true }, + { 104480, true }, + { 104490, true }, + { 104500, true }, + { 104514, true }, + { 104523, true }, + { 104536, true }, + { 104552, true }, + { 104567, true }, { 104592, true }, - { 104614, true }, - { 104629, true }, - { 104637, true }, + { 104618, true }, + { 104633, true }, { 104645, true }, - { 104656, true }, - { 104672, true }, - { 104688, true }, - { 104705, true }, - { 104719, true }, - { 104733, true }, - { 104749, true }, - { 104776, true }, + { 104670, true }, + { 104677, true }, + { 104699, true }, + { 104714, true }, + { 104722, true }, + { 104730, true }, + { 104741, true }, + { 104757, true }, + { 104773, true }, { 104790, true }, - { 104799, true }, - { 104812, true }, - { 104824, true }, - { 104840, true }, - { 104863, true }, - { 104883, true }, - { 104902, true }, - { 104924, false }, - { 104935, true }, - { 104952, true }, - { 104966, true }, - { 104986, true }, - { 105011, true }, - { 105027, true }, - { 105039, true }, + { 104804, true }, + { 104818, true }, + { 104834, true }, + { 104861, true }, + { 104875, true }, + { 104884, true }, + { 104897, true }, + { 104909, true }, + { 104925, true }, + { 104948, true }, + { 104968, true }, + { 104987, true }, + { 105009, false }, + { 105020, true }, + { 105037, true }, { 105051, true }, - { 105073, true }, - { 105088, true }, - { 105103, true }, - { 105120, true }, - { 105135, true }, - { 105152, true }, - { 105167, true }, - { 105182, true }, - { 105194, true }, - { 105209, true }, - { 105223, false }, - { 105233, true }, - { 105250, true }, - { 105261, false }, - { 105276, true }, - { 105293, true }, - { 105307, true }, - { 105320, true }, - { 105333, true }, - { 105345, true }, - { 105357, true }, - { 105367, true }, - { 105379, true }, - { 105394, true }, - { 105406, true }, - { 105417, true }, - { 105437, true }, - { 105449, true }, - { 105460, true }, - { 105475, true }, + { 105071, true }, + { 105096, true }, + { 105112, true }, + { 105124, true }, + { 105136, true }, + { 105158, true }, + { 105173, true }, + { 105188, true }, + { 105205, true }, + { 105220, true }, + { 105237, true }, + { 105252, true }, + { 105267, true }, + { 105279, true }, + { 105294, true }, + { 105308, false }, + { 105318, true }, + { 105335, true }, + { 105346, false }, + { 105361, true }, + { 105378, true }, + { 105392, true }, + { 105405, true }, + { 105418, true }, + { 105430, true }, + { 105442, true }, + { 105452, true }, + { 105464, true }, + { 105479, true }, { 105491, true }, { 105502, true }, - { 105527, true }, - { 105536, true }, - { 105551, true }, - { 105559, true }, - { 105572, true }, - { 105595, true }, + { 105522, true }, + { 105534, true }, + { 105545, true }, + { 105560, true }, + { 105576, true }, + { 105587, true }, { 105612, true }, - { 105623, true }, - { 105641, true }, - { 105659, true }, - { 105675, false }, - { 105687, true }, - { 105695, true }, - { 105705, true }, - { 105720, true }, - { 105734, true }, - { 105744, false }, - { 105762, true }, - { 105786, true }, - { 105801, true }, - { 105813, true }, - { 105841, true }, - { 105857, true }, + { 105621, true }, + { 105636, true }, + { 105644, true }, + { 105657, true }, + { 105680, true }, + { 105697, true }, + { 105708, true }, + { 105726, true }, + { 105744, true }, + { 105760, false }, + { 105772, true }, + { 105780, true }, + { 105790, true }, + { 105805, true }, + { 105819, true }, + { 105829, false }, + { 105847, true }, { 105871, true }, - { 105899, true }, - { 105915, true }, - { 105932, true }, - { 105946, true }, - { 105963, true }, - { 105985, true }, - { 105995, true }, - { 106005, true }, - { 106023, true }, - { 106032, true }, - { 106046, true }, - { 106065, true }, - { 106083, true }, - { 106102, true }, - { 106127, true }, - { 106143, true }, - { 106162, true }, - { 106183, true }, - { 106200, true }, - { 106214, true }, - { 106227, true }, - { 106256, true }, - { 106286, true }, - { 106298, true }, - { 106307, true }, - { 106320, true }, - { 106331, true }, - { 106353, true }, - { 106364, true }, - { 106382, true }, + { 105886, true }, + { 105898, true }, + { 105926, true }, + { 105942, true }, + { 105956, true }, + { 105984, true }, + { 106000, true }, + { 106017, true }, + { 106031, true }, + { 106048, true }, + { 106070, true }, + { 106080, true }, + { 106090, true }, + { 106108, true }, + { 106117, true }, + { 106131, true }, + { 106150, true }, + { 106168, true }, + { 106187, true }, + { 106212, true }, + { 106228, true }, + { 106247, true }, + { 106268, true }, + { 106285, true }, + { 106299, true }, + { 106312, true }, + { 106341, true }, + { 106371, true }, + { 106383, true }, { 106392, true }, - { 106421, true }, - { 106434, true }, - { 106450, true }, + { 106405, true }, + { 106416, true }, + { 106438, true }, + { 106449, true }, { 106467, true }, - { 106490, true }, + { 106477, true }, { 106506, true }, - { 106529, true }, - { 106555, true }, - { 106569, true }, - { 106583, true }, - { 106602, true }, - { 106616, false }, - { 106626, true }, - { 106638, true }, + { 106519, true }, + { 106535, true }, + { 106552, true }, + { 106575, true }, + { 106591, true }, + { 106614, true }, + { 106640, true }, { 106654, true }, - { 106662, true }, - { 106681, true }, - { 106693, false }, - { 106704, true }, - { 106712, true }, - { 106728, true }, - { 106742, true }, - { 106754, true }, - { 106767, true }, - { 106776, true }, - { 106790, true }, - { 106809, true }, - { 106818, true }, - { 106829, true }, - { 106841, true }, - { 106854, true }, - { 106864, true }, - { 106877, true }, - { 106889, true }, - { 106905, true }, - { 106913, false }, - { 106921, true }, - { 106943, true }, - { 106951, true }, - { 106972, true }, - { 106996, true }, - { 107012, true }, + { 106668, true }, + { 106687, true }, + { 106701, false }, + { 106711, true }, + { 106723, true }, + { 106739, true }, + { 106747, true }, + { 106766, true }, + { 106778, false }, + { 106789, true }, + { 106797, true }, + { 106813, true }, + { 106827, true }, + { 106839, true }, + { 106852, true }, + { 106861, true }, + { 106875, true }, + { 106894, true }, + { 106903, true }, + { 106914, true }, + { 106926, true }, + { 106939, true }, + { 106949, true }, + { 106962, true }, + { 106974, true }, + { 106990, true }, + { 106998, false }, + { 107006, true }, { 107028, true }, - { 107038, true }, - { 107052, true }, - { 107069, true }, - { 107079, true }, - { 107091, true }, - { 107101, true }, - { 107116, true }, - { 107128, true }, - { 107138, true }, - { 107148, true }, - { 107157, true }, - { 107167, true }, - { 107182, true }, - { 107194, true }, - { 107217, true }, - { 107230, true }, - { 107243, true }, - { 107257, true }, - { 107272, true }, - { 107285, true }, - { 107297, true }, - { 107306, true }, - { 107324, true }, - { 107337, true }, - { 107352, true }, - { 107367, true }, - { 107377, true }, - { 107397, true }, - { 107411, true }, - { 107434, true }, - { 107446, true }, - { 107461, true }, - { 107469, true }, - { 107480, true }, - { 107502, true }, - { 107513, true }, - { 107526, true }, - { 107536, true }, - { 107550, true }, - { 107558, true }, - { 107566, true }, - { 107581, true }, - { 107591, true }, - { 107601, true }, - { 107616, true }, - { 107624, true }, - { 107633, true }, - { 107644, true }, - { 107656, true }, - { 107668, true }, - { 107678, true }, - { 107688, true }, - { 107700, true }, - { 107714, true }, + { 107036, true }, + { 107057, true }, + { 107081, true }, + { 107097, true }, + { 107113, true }, + { 107123, true }, + { 107137, true }, + { 107154, true }, + { 107164, true }, + { 107176, true }, + { 107186, true }, + { 107201, true }, + { 107213, true }, + { 107223, true }, + { 107233, true }, + { 107242, true }, + { 107252, true }, + { 107267, true }, + { 107279, true }, + { 107302, true }, + { 107315, true }, + { 107328, true }, + { 107342, true }, + { 107357, true }, + { 107370, true }, + { 107382, true }, + { 107391, true }, + { 107409, true }, + { 107422, true }, + { 107437, true }, + { 107452, true }, + { 107462, true }, + { 107482, true }, + { 107496, true }, + { 107519, true }, + { 107531, true }, + { 107546, true }, + { 107554, true }, + { 107565, true }, + { 107587, true }, + { 107598, true }, + { 107611, true }, + { 107621, true }, + { 107635, true }, + { 107643, true }, + { 107651, true }, + { 107666, true }, + { 107676, true }, + { 107686, true }, + { 107701, true }, + { 107709, true }, + { 107718, true }, { 107729, true }, - { 107746, true }, - { 107758, true }, - { 107769, true }, - { 107776, true }, - { 107790, true }, - { 107801, true }, - { 107812, true }, - { 107823, true }, + { 107741, true }, + { 107753, true }, + { 107763, true }, + { 107773, true }, + { 107785, true }, + { 107799, true }, + { 107814, true }, { 107831, true }, - { 107846, true }, - { 107860, true }, - { 107874, true }, - { 107889, true }, - { 107904, true }, - { 107917, true }, - { 107928, true }, - { 107943, true }, - { 107956, true }, - { 107969, true }, - { 107976, true }, - { 107996, true }, - { 108005, true }, - { 108017, true }, - { 108030, true }, - { 108047, true }, - { 108062, true }, - { 108074, true }, - { 108089, true }, + { 107843, true }, + { 107854, true }, + { 107861, true }, + { 107875, true }, + { 107886, true }, + { 107897, true }, + { 107908, true }, + { 107916, true }, + { 107931, true }, + { 107945, true }, + { 107959, true }, + { 107974, true }, + { 107989, true }, + { 108002, true }, + { 108013, true }, + { 108028, true }, + { 108041, true }, + { 108054, true }, + { 108061, true }, + { 108081, true }, + { 108090, true }, { 108102, true }, - { 108118, true }, - { 108138, true }, - { 108158, true }, - { 108181, true }, - { 108190, true }, - { 108206, true }, - { 108218, true }, - { 108227, true }, - { 108237, true }, - { 108246, true }, - { 108254, true }, - { 108264, false }, - { 108271, true }, - { 108282, true }, - { 108295, true }, - { 108310, true }, - { 108327, true }, + { 108115, true }, + { 108132, true }, + { 108147, true }, + { 108159, true }, + { 108174, true }, + { 108187, true }, + { 108203, true }, + { 108223, true }, + { 108243, true }, + { 108266, true }, + { 108275, true }, + { 108291, true }, + { 108303, true }, + { 108312, true }, + { 108322, true }, + { 108331, true }, { 108339, true }, - { 108360, true }, + { 108349, false }, + { 108356, true }, { 108367, true }, - { 108387, true }, - { 108397, true }, - { 108408, false }, - { 108421, true }, - { 108435, true }, - { 108450, true }, - { 108460, true }, + { 108380, true }, + { 108395, true }, + { 108412, true }, + { 108424, true }, + { 108445, true }, + { 108452, true }, { 108472, true }, - { 108492, false }, - { 108508, true }, - { 108517, false }, - { 108526, true }, + { 108482, true }, + { 108493, false }, + { 108506, true }, + { 108520, true }, + { 108535, true }, { 108545, true }, - { 108553, true }, - { 108565, true }, - { 108572, true }, - { 108590, true }, - { 108606, true }, - { 108625, true }, + { 108557, true }, + { 108577, false }, + { 108593, true }, + { 108602, false }, + { 108611, true }, + { 108630, true }, { 108638, true }, - { 108655, true }, - { 108674, true }, - { 108687, false }, - { 108696, true }, - { 108709, true }, - { 108729, true }, - { 108746, true }, - { 108761, true }, - { 108777, false }, - { 108792, true }, - { 108806, true }, - { 108819, true }, - { 108838, true }, - { 108855, true }, - { 108866, true }, + { 108650, true }, + { 108657, true }, + { 108675, true }, + { 108691, true }, + { 108710, true }, + { 108723, true }, + { 108740, true }, + { 108759, true }, + { 108772, false }, + { 108781, true }, + { 108794, true }, + { 108814, true }, + { 108831, true }, + { 108846, true }, + { 108862, false }, { 108877, true }, - { 108894, false }, - { 108915, false }, - { 108931, false }, + { 108891, true }, + { 108904, true }, + { 108923, true }, + { 108940, true }, { 108951, true }, - { 108963, true }, - { 108986, true }, - { 108998, true }, - { 109011, true }, - { 109023, true }, - { 109040, true }, - { 109055, false }, - { 109066, true }, - { 109075, true }, - { 109086, true }, - { 109101, true }, - { 109122, true }, - { 109140, true }, - { 109167, true }, - { 109177, true }, - { 109185, true }, - { 109195, true }, - { 109209, true }, - { 109221, true }, - { 109236, true }, - { 109246, true }, - { 109257, true }, - { 109271, true }, - { 109280, true }, - { 109299, true }, - { 109312, true }, - { 109322, true }, - { 109330, true }, - { 109337, true }, - { 109350, true }, - { 109360, true }, - { 109369, true }, - { 109381, false }, - { 109391, true }, - { 109411, true }, - { 109420, true }, - { 109432, true }, - { 109443, true }, - { 109454, true }, - { 109477, true }, - { 109500, true }, - { 109523, true }, - { 109533, false }, - { 109550, true }, - { 109559, true }, - { 109569, true }, - { 109582, true }, - { 109590, true }, - { 109600, true }, - { 109611, true }, - { 109621, true }, + { 108962, true }, + { 108979, false }, + { 109000, false }, + { 109016, false }, + { 109036, true }, + { 109048, true }, + { 109071, true }, + { 109083, true }, + { 109096, true }, + { 109108, true }, + { 109125, true }, + { 109140, false }, + { 109151, true }, + { 109160, true }, + { 109171, true }, + { 109186, true }, + { 109207, true }, + { 109225, true }, + { 109252, true }, + { 109262, true }, + { 109270, true }, + { 109284, true }, + { 109296, true }, + { 109311, true }, + { 109321, true }, + { 109332, true }, + { 109346, true }, + { 109355, true }, + { 109374, true }, + { 109387, true }, + { 109397, true }, + { 109405, true }, + { 109412, true }, + { 109425, true }, + { 109435, true }, + { 109444, true }, + { 109456, false }, + { 109466, true }, + { 109486, true }, + { 109495, true }, + { 109507, true }, + { 109518, true }, + { 109529, true }, + { 109552, true }, + { 109575, true }, + { 109598, true }, + { 109608, false }, + { 109625, true }, { 109634, true }, - { 109646, true }, - { 109661, true }, - { 109673, true }, - { 109689, true }, - { 109703, true }, - { 109717, true }, - { 109724, true }, - { 109734, true }, - { 109746, true }, - { 109755, true }, - { 109771, false }, - { 109785, true }, - { 109796, true }, - { 109808, true }, - { 109820, true }, - { 109829, true }, - { 109843, true }, - { 109855, true }, - { 109867, true }, - { 109877, true }, - { 109887, true }, - { 109897, true }, - { 109907, true }, - { 109925, true }, - { 109940, true }, - { 109951, true }, - { 109964, true }, - { 109975, true }, + { 109644, true }, + { 109657, true }, + { 109665, true }, + { 109675, true }, + { 109686, true }, + { 109696, true }, + { 109709, true }, + { 109721, true }, + { 109736, true }, + { 109748, true }, + { 109764, true }, + { 109778, true }, + { 109792, true }, + { 109799, true }, + { 109809, true }, + { 109821, true }, + { 109830, true }, + { 109846, false }, + { 109860, true }, + { 109871, true }, + { 109883, true }, + { 109895, true }, + { 109904, true }, + { 109918, true }, + { 109930, true }, + { 109942, true }, + { 109952, true }, + { 109962, true }, + { 109972, true }, { 109982, true }, - { 109999, false }, - { 110010, true }, - { 110020, true }, - { 110030, true }, - { 110041, true }, + { 110000, true }, + { 110015, true }, + { 110026, true }, + { 110039, true }, { 110050, true }, - { 110072, true }, - { 110097, true }, + { 110057, true }, + { 110074, false }, + { 110085, true }, + { 110095, true }, + { 110105, true }, { 110116, true }, - { 110123, true }, - { 110137, true }, - { 110146, true }, - { 110161, true }, - { 110171, true }, - { 110195, true }, - { 110211, true }, - { 110233, true }, - { 110243, true }, - { 110257, true }, + { 110125, true }, + { 110147, true }, + { 110172, true }, + { 110191, true }, + { 110198, true }, + { 110212, true }, + { 110221, true }, + { 110236, true }, + { 110246, true }, { 110270, true }, - { 110284, true }, - { 110307, true }, + { 110286, true }, + { 110308, true }, { 110318, true }, - { 110327, true }, - { 110338, true }, - { 110352, true }, - { 110361, true }, - { 110372, true }, - { 110386, true }, - { 110397, true }, - { 110407, true }, - { 110419, true }, - { 110438, true }, - { 110451, true }, - { 110471, true }, - { 110495, true }, - { 110504, true }, - { 110517, true }, - { 110529, true }, - { 110542, true }, - { 110554, true }, - { 110562, true }, - { 110574, true }, - { 110583, true }, - { 110598, true }, - { 110607, true }, + { 110332, true }, + { 110345, true }, + { 110359, true }, + { 110382, true }, + { 110393, true }, + { 110402, true }, + { 110413, true }, + { 110427, true }, + { 110436, true }, + { 110447, true }, + { 110461, true }, + { 110472, true }, + { 110482, true }, + { 110494, true }, + { 110513, true }, + { 110526, true }, + { 110546, true }, + { 110570, true }, + { 110579, true }, + { 110592, true }, + { 110604, true }, + { 110617, true }, { 110629, true }, - { 110641, true }, - { 110651, true }, - { 110666, true }, - { 110674, true }, - { 110687, true }, - { 110702, true }, - { 110713, true }, - { 110724, true }, - { 110733, true }, - { 110748, true }, + { 110637, true }, + { 110649, true }, + { 110658, true }, + { 110673, true }, + { 110682, true }, + { 110704, true }, + { 110716, true }, + { 110726, true }, + { 110741, true }, + { 110749, true }, { 110762, true }, - { 110776, true }, - { 110796, true }, - { 110819, true }, - { 110844, true }, - { 110863, true }, - { 110880, true }, - { 110900, true }, - { 110916, true }, - { 110930, true }, - { 110946, true }, - { 110962, true }, - { 110980, true }, - { 110997, true }, - { 111012, true }, - { 111027, true }, + { 110777, true }, + { 110788, true }, + { 110799, true }, + { 110808, true }, + { 110823, true }, + { 110837, true }, + { 110851, true }, + { 110871, true }, + { 110894, true }, + { 110919, true }, + { 110938, true }, + { 110955, true }, + { 110975, true }, + { 110991, true }, + { 111005, true }, + { 111021, true }, { 111037, true }, - { 111052, true }, - { 111061, true }, - { 111074, true }, - { 111091, true }, - { 111104, true }, - { 111119, true }, - { 111129, true }, + { 111055, true }, + { 111072, true }, + { 111087, true }, + { 111102, true }, + { 111112, true }, + { 111127, true }, { 111140, true }, - { 111151, true }, - { 111161, true }, - { 111173, true }, - { 111186, true }, - { 111198, true }, - { 111219, true }, - { 111233, false }, - { 111253, false }, - { 111265, true }, - { 111278, true }, - { 111288, true }, - { 111301, true }, - { 111314, true }, - { 111330, true }, - { 111347, true }, - { 111359, true }, - { 111373, true }, - { 111385, true }, - { 111399, true }, - { 111419, true }, - { 111435, true }, - { 111447, true }, - { 111473, true }, - { 111494, true }, - { 111508, true }, - { 111526, false }, - { 111540, true }, - { 111558, true }, - { 111575, true }, - { 111587, true }, - { 111600, true }, - { 111620, true }, - { 111636, true }, - { 111648, true }, - { 111670, true }, - { 111692, true }, - { 111711, false }, - { 111721, true }, - { 111738, true }, - { 111760, true }, - { 111772, true }, - { 111783, true }, - { 111796, true }, - { 111816, true }, + { 111157, true }, + { 111170, true }, + { 111185, true }, + { 111195, true }, + { 111206, true }, + { 111217, true }, + { 111227, true }, + { 111239, true }, + { 111252, true }, + { 111264, true }, + { 111285, true }, + { 111299, false }, + { 111319, false }, + { 111331, true }, + { 111344, true }, + { 111354, true }, + { 111367, true }, + { 111380, true }, + { 111396, true }, + { 111413, true }, + { 111425, true }, + { 111439, true }, + { 111451, true }, + { 111465, true }, + { 111485, true }, + { 111501, true }, + { 111513, true }, + { 111539, true }, + { 111560, true }, + { 111574, true }, + { 111592, false }, + { 111606, true }, + { 111624, true }, + { 111641, true }, + { 111653, true }, + { 111666, true }, + { 111686, true }, + { 111702, true }, + { 111714, true }, + { 111736, true }, + { 111758, true }, + { 111777, false }, + { 111787, true }, + { 111804, true }, { 111826, true }, - { 111834, true }, - { 111845, true }, - { 111870, true }, - { 111885, true }, - { 111902, true }, - { 111923, true }, - { 111943, true }, - { 111965, true }, - { 111984, true }, - { 111995, false }, - { 112008, true }, - { 112019, true }, - { 112035, true }, + { 111838, true }, + { 111849, true }, + { 111862, true }, + { 111882, true }, + { 111892, true }, + { 111900, true }, + { 111911, true }, + { 111936, true }, + { 111951, true }, + { 111968, true }, + { 111989, true }, + { 112009, true }, + { 112031, true }, { 112050, true }, - { 112065, true }, + { 112061, false }, + { 112074, true }, { 112085, true }, - { 112096, true }, - { 112108, true }, - { 112126, true }, - { 112151, true }, + { 112101, true }, + { 112116, true }, + { 112131, true }, + { 112143, true }, + { 112163, true }, { 112174, true }, - { 112190, true }, - { 112207, true }, - { 112218, true }, - { 112232, true }, - { 112244, true }, - { 112260, false }, - { 112273, true }, - { 112286, true }, - { 112298, true }, - { 112309, true }, - { 112326, true }, - { 112339, true }, + { 112186, true }, + { 112204, true }, + { 112229, true }, + { 112252, true }, + { 112268, true }, + { 112285, true }, + { 112296, true }, + { 112310, true }, + { 112322, true }, + { 112338, false }, { 112351, true }, - { 112361, false }, - { 112370, true }, - { 112380, true }, - { 112393, true }, + { 112364, true }, + { 112376, true }, + { 112387, true }, { 112404, true }, - { 112427, true }, - { 112440, true }, + { 112417, true }, + { 112429, true }, + { 112439, false }, + { 112448, true }, { 112458, true }, - { 112469, true }, - { 112483, true }, - { 112499, true }, - { 112507, true }, - { 112526, true }, - { 112539, true }, - { 112562, true }, - { 112576, true }, - { 112591, true }, - { 112601, true }, - { 112614, true }, - { 112627, true }, - { 112642, true }, - { 112665, true }, - { 112681, true }, - { 112697, true }, - { 112714, true }, - { 112727, true }, - { 112739, true }, - { 112752, true }, - { 112764, true }, - { 112779, true }, - { 112791, true }, - { 112819, true }, - { 112836, true }, - { 112845, true }, - { 112872, true }, - { 112893, true }, - { 112911, true }, - { 112928, true }, - { 112939, true }, - { 112957, true }, - { 112972, true }, - { 112984, true }, - { 112996, true }, - { 113008, true }, - { 113027, true }, + { 112471, true }, + { 112482, true }, + { 112505, true }, + { 112518, true }, + { 112536, true }, + { 112547, true }, + { 112561, true }, + { 112577, true }, + { 112585, true }, + { 112604, true }, + { 112617, true }, + { 112640, true }, + { 112654, true }, + { 112669, true }, + { 112679, true }, + { 112692, true }, + { 112705, true }, + { 112720, true }, + { 112743, true }, + { 112759, true }, + { 112775, true }, + { 112792, true }, + { 112805, true }, + { 112817, true }, + { 112830, true }, + { 112842, true }, + { 112857, true }, + { 112869, true }, + { 112897, true }, + { 112914, true }, + { 112923, true }, + { 112950, true }, + { 112971, true }, + { 112989, true }, + { 113006, true }, + { 113017, true }, + { 113035, true }, + { 113050, true }, { 113062, true }, - { 113085, true }, - { 113107, true }, - { 113121, true }, - { 113138, true }, - { 113151, true }, + { 113074, true }, + { 113086, true }, + { 113105, true }, + { 113140, true }, { 113163, true }, - { 113180, false }, + { 113185, true }, { 113199, true }, - { 113217, true }, - { 113231, true }, - { 113262, true }, - { 113279, true }, - { 113294, true }, - { 113306, true }, - { 113318, true }, - { 113331, true }, - { 113350, true }, + { 113216, true }, + { 113229, true }, + { 113241, true }, + { 113258, false }, + { 113277, true }, + { 113295, true }, + { 113309, true }, + { 113340, true }, + { 113357, true }, { 113372, true }, { 113384, true }, - { 113401, true }, - { 113418, true }, - { 113440, true }, - { 113456, true }, - { 113469, true }, - { 113481, true }, - { 113502, true }, - { 113521, true }, - { 113533, true }, - { 113550, true }, - { 113565, true }, - { 113582, true }, + { 113396, true }, + { 113409, true }, + { 113428, true }, + { 113450, true }, + { 113462, true }, + { 113479, true }, + { 113496, true }, + { 113518, true }, + { 113534, true }, + { 113547, true }, + { 113559, true }, + { 113580, true }, { 113599, true }, - { 113615, true }, - { 113630, true }, - { 113646, true }, - { 113670, true }, - { 113695, true }, - { 113717, true }, - { 113732, true }, - { 113759, true }, - { 113777, true }, - { 113794, true }, - { 113817, true }, - { 113843, true }, - { 113858, true }, - { 113876, true }, - { 113897, true }, - { 113925, true }, - { 113944, true }, - { 113968, true }, - { 113992, true }, - { 114005, true }, - { 114018, true }, - { 114035, true }, - { 114050, true }, - { 114075, false }, - { 114089, true }, + { 113611, true }, + { 113628, true }, + { 113643, true }, + { 113660, true }, + { 113677, true }, + { 113693, true }, + { 113708, true }, + { 113724, true }, + { 113740, true }, + { 113764, true }, + { 113789, true }, + { 113811, true }, + { 113826, true }, + { 113853, true }, + { 113871, true }, + { 113888, true }, + { 113911, true }, + { 113937, true }, + { 113952, true }, + { 113970, true }, + { 113991, true }, + { 114019, true }, + { 114038, true }, + { 114062, true }, + { 114086, true }, { 114099, true }, - { 114115, true }, - { 114134, true }, - { 114150, true }, - { 114174, true }, - { 114191, false }, - { 114200, true }, - { 114215, true }, - { 114225, true }, - { 114237, true }, - { 114258, true }, - { 114271, true }, - { 114288, true }, - { 114301, true }, + { 114112, true }, + { 114129, true }, + { 114144, true }, + { 114169, false }, + { 114183, true }, + { 114193, true }, + { 114209, true }, + { 114228, true }, + { 114244, true }, + { 114268, true }, + { 114285, false }, + { 114294, true }, + { 114309, true }, { 114319, true }, - { 114332, true }, - { 114351, true }, - { 114361, true }, - { 114377, true }, - { 114393, true }, - { 114409, true }, - { 114422, true }, - { 114441, true }, - { 114459, true }, - { 114473, true }, - { 114483, false }, - { 114495, true }, - { 114506, true }, - { 114514, true }, - { 114524, true }, - { 114534, true }, - { 114546, true }, - { 114560, false }, - { 114573, true }, - { 114581, true }, - { 114592, true }, - { 114603, true }, - { 114619, true }, - { 114629, true }, - { 114638, true }, + { 114331, true }, + { 114352, true }, + { 114365, true }, + { 114382, true }, + { 114395, true }, + { 114413, true }, + { 114426, true }, + { 114445, true }, + { 114455, true }, + { 114471, true }, + { 114487, true }, + { 114503, true }, + { 114516, true }, + { 114535, true }, + { 114553, true }, + { 114567, true }, + { 114577, false }, + { 114589, true }, + { 114600, true }, + { 114608, true }, + { 114618, true }, + { 114628, true }, + { 114640, true }, { 114654, false }, - { 114661, true }, - { 114669, true }, - { 114679, true }, - { 114691, true }, - { 114705, true }, - { 114714, true }, - { 114730, true }, - { 114738, true }, - { 114747, true }, - { 114763, true }, - { 114774, true }, - { 114784, false }, - { 114802, true }, - { 114812, true }, - { 114823, true }, - { 114835, true }, - { 114847, false }, - { 114858, true }, - { 114871, true }, - { 114881, true }, - { 114891, true }, - { 114901, true }, - { 114911, true }, - { 114921, true }, - { 114940, true }, - { 114949, true }, - { 114958, true }, - { 114978, true }, - { 114994, true }, - { 115002, true }, - { 115011, true }, - { 115032, true }, - { 115040, true }, - { 115056, true }, - { 115073, true }, - { 115081, true }, - { 115092, true }, - { 115104, true }, - { 115115, true }, - { 115125, true }, - { 115140, true }, - { 115151, true }, - { 115161, true }, - { 115170, true }, + { 114667, true }, + { 114675, true }, + { 114686, true }, + { 114697, true }, + { 114713, true }, + { 114723, true }, + { 114735, true }, + { 114744, true }, + { 114760, false }, + { 114767, true }, + { 114775, true }, + { 114785, true }, + { 114797, true }, + { 114811, true }, + { 114820, true }, + { 114836, true }, + { 114844, true }, + { 114853, true }, + { 114869, true }, + { 114880, true }, + { 114890, false }, + { 114908, true }, + { 114918, true }, + { 114929, true }, + { 114941, true }, + { 114953, false }, + { 114964, true }, + { 114977, true }, + { 114987, true }, + { 114997, true }, + { 115007, true }, + { 115017, true }, + { 115027, true }, + { 115046, true }, + { 115055, true }, + { 115064, true }, + { 115084, true }, + { 115100, true }, + { 115108, true }, + { 115117, true }, + { 115138, true }, + { 115146, true }, + { 115162, true }, { 115179, true }, - { 115197, true }, - { 115213, true }, - { 115226, true }, - { 115240, true }, - { 115268, true }, - { 115281, true }, - { 115290, true }, - { 115309, true }, + { 115187, true }, + { 115198, true }, + { 115210, true }, + { 115221, true }, + { 115231, true }, + { 115246, true }, + { 115257, true }, + { 115267, true }, + { 115276, true }, + { 115285, true }, + { 115303, true }, { 115319, true }, - { 115334, true }, - { 115351, true }, + { 115332, true }, + { 115346, true }, { 115374, true }, - { 115393, true }, - { 115402, true }, - { 115420, true }, - { 115434, true }, + { 115387, true }, + { 115396, true }, + { 115415, true }, + { 115425, true }, + { 115440, true }, { 115457, true }, - { 115479, true }, - { 115489, true }, - { 115505, true }, - { 115521, true }, - { 115532, true }, - { 115542, true }, - { 115554, true }, - { 115567, true }, - { 115579, true }, - { 115596, true }, - { 115613, true }, - { 115624, true }, - { 115642, true }, - { 115656, true }, - { 115670, true }, - { 115688, true }, - { 115707, true }, - { 115723, true }, - { 115734, true }, - { 115745, true }, - { 115763, true }, - { 115782, true }, - { 115795, true }, - { 115806, true }, - { 115816, true }, + { 115480, true }, + { 115499, true }, + { 115508, true }, + { 115526, true }, + { 115540, true }, + { 115563, true }, + { 115585, true }, + { 115595, true }, + { 115611, true }, + { 115627, true }, + { 115638, true }, + { 115648, true }, + { 115660, true }, + { 115673, true }, + { 115685, true }, + { 115702, true }, + { 115719, true }, + { 115730, true }, + { 115748, true }, + { 115762, true }, + { 115776, true }, + { 115794, true }, + { 115813, true }, { 115829, true }, - { 115841, true }, - { 115857, true }, - { 115868, true }, - { 115878, true }, + { 115840, true }, + { 115851, true }, + { 115869, true }, { 115888, true }, - { 115898, true }, - { 115908, true }, - { 115919, true }, - { 115930, true }, - { 115942, true }, - { 115952, true }, - { 115961, true }, - { 115978, true }, - { 115997, true }, - { 116010, true }, - { 116029, true }, - { 116042, true }, - { 116059, true }, + { 115901, true }, + { 115912, true }, + { 115922, true }, + { 115935, true }, + { 115951, true }, + { 115962, true }, + { 115972, true }, + { 115982, true }, + { 115992, true }, + { 116002, true }, + { 116013, true }, + { 116024, true }, + { 116036, true }, + { 116046, true }, + { 116055, true }, + { 116072, true }, { 116091, true }, - { 116105, true }, - { 116117, true }, - { 116141, true }, - { 116164, true }, - { 116196, true }, - { 116221, true }, - { 116234, true }, - { 116260, true }, - { 116279, true }, - { 116293, true }, - { 116307, true }, - { 116320, true }, - { 116335, true }, - { 116350, true }, - { 116364, true }, - { 116378, false }, - { 116398, true }, - { 116411, true }, - { 116428, true }, - { 116443, true }, - { 116460, true }, - { 116474, true }, - { 116489, true }, - { 116498, true }, - { 116507, true }, - { 116523, true }, - { 116543, true }, - { 116562, true }, - { 116571, true }, - { 116580, true }, - { 116589, true }, - { 116598, true }, - { 116610, true }, - { 116621, true }, - { 116630, true }, - { 116638, true }, - { 116647, true }, - { 116658, true }, - { 116671, true }, - { 116680, true }, - { 116693, true }, - { 116703, true }, - { 116716, true }, - { 116729, true }, - { 116740, true }, - { 116751, true }, - { 116762, true }, - { 116771, true }, - { 116780, true }, - { 116790, true }, - { 116807, true }, - { 116824, true }, - { 116833, true }, - { 116848, true }, - { 116867, false }, - { 116879, true }, - { 116892, true }, - { 116909, false }, - { 116922, true }, - { 116931, true }, - { 116954, false }, - { 116966, true }, - { 116979, true }, - { 116990, true }, - { 117007, true }, - { 117018, true }, - { 117035, true }, - { 117056, true }, - { 117067, true }, - { 117078, true }, - { 117085, true }, - { 117096, true }, - { 117103, true }, - { 117113, true }, - { 117125, true }, - { 117139, true }, - { 117148, true }, - { 117161, true }, - { 117173, true }, - { 117187, true }, - { 117201, true }, - { 117208, true }, - { 117215, true }, - { 117222, true }, - { 117231, true }, - { 117240, true }, - { 117248, true }, - { 117258, true }, - { 117276, true }, - { 117290, true }, - { 117302, true }, - { 117313, true }, - { 117324, true }, - { 117335, true }, + { 116104, true }, + { 116123, true }, + { 116136, true }, + { 116153, true }, + { 116185, true }, + { 116199, true }, + { 116211, true }, + { 116235, true }, + { 116258, true }, + { 116290, true }, + { 116315, true }, + { 116328, true }, + { 116354, true }, + { 116373, true }, + { 116387, true }, + { 116401, true }, + { 116414, true }, + { 116429, true }, + { 116444, true }, + { 116458, true }, + { 116472, false }, + { 116492, true }, + { 116505, true }, + { 116522, true }, + { 116537, true }, + { 116554, true }, + { 116568, true }, + { 116583, true }, + { 116592, true }, + { 116601, true }, + { 116617, true }, + { 116637, true }, + { 116656, true }, + { 116665, true }, + { 116674, true }, + { 116683, true }, + { 116692, true }, + { 116704, true }, + { 116715, true }, + { 116724, true }, + { 116732, true }, + { 116741, true }, + { 116752, true }, + { 116765, true }, + { 116774, true }, + { 116787, true }, + { 116797, true }, + { 116810, true }, + { 116823, true }, + { 116834, true }, + { 116845, true }, + { 116856, true }, + { 116865, true }, + { 116874, true }, + { 116884, true }, + { 116901, true }, + { 116918, true }, + { 116927, true }, + { 116942, true }, + { 116961, false }, + { 116973, true }, + { 116986, true }, + { 117003, false }, + { 117016, true }, + { 117025, true }, + { 117039, true }, + { 117062, false }, + { 117074, true }, + { 117087, true }, + { 117098, true }, + { 117115, true }, + { 117126, true }, + { 117143, true }, + { 117164, true }, + { 117175, true }, + { 117186, true }, + { 117193, true }, + { 117204, true }, + { 117211, true }, + { 117221, true }, + { 117233, true }, + { 117247, true }, + { 117256, true }, + { 117269, true }, + { 117281, true }, + { 117295, true }, + { 117309, true }, + { 117316, true }, + { 117323, true }, + { 117330, true }, + { 117339, true }, { 117348, true }, - { 117359, true }, - { 117368, true }, - { 117385, true }, - { 117396, true }, - { 117412, true }, - { 117419, true }, - { 117426, true }, - { 117440, true }, - { 117448, true }, - { 117455, true }, - { 117466, true }, - { 117472, true }, - { 117484, true }, - { 117497, true }, - { 117510, true }, + { 117356, true }, + { 117366, true }, + { 117384, true }, + { 117398, true }, + { 117410, true }, + { 117421, true }, + { 117432, true }, + { 117443, true }, + { 117456, true }, + { 117467, true }, + { 117476, true }, + { 117493, true }, + { 117504, true }, { 117520, true }, - { 117530, true }, - { 117543, true }, - { 117557, true }, - { 117572, true }, - { 117585, true }, - { 117598, true }, - { 117607, true }, - { 117626, true }, - { 117651, false }, - { 117663, true }, - { 117671, true }, - { 117685, true }, - { 117698, true }, - { 117713, true }, - { 117732, true }, - { 117745, true }, - { 117760, true }, - { 117773, true }, - { 117784, true }, - { 117797, true }, - { 117814, true }, - { 117828, false }, - { 117847, true }, - { 117862, true }, - { 117874, true }, - { 117882, true }, - { 117894, true }, - { 117908, true }, - { 117924, true }, - { 117940, true }, - { 117956, true }, - { 117971, true }, - { 117991, true }, - { 118009, true }, - { 118018, true }, - { 118034, true }, - { 118049, true }, - { 118063, true }, - { 118076, true }, - { 118096, true }, - { 118115, true }, - { 118132, true }, - { 118148, true }, - { 118168, true }, - { 118181, true }, - { 118195, false }, - { 118208, true }, - { 118218, true }, - { 118230, true }, - { 118247, true }, - { 118262, true }, - { 118285, true }, - { 118298, true }, - { 118315, true }, - { 118329, true }, - { 118341, true }, - { 118356, true }, - { 118373, true }, - { 118387, true }, - { 118402, true }, - { 118411, true }, - { 118426, true }, - { 118444, true }, - { 118458, true }, - { 118468, true }, - { 118479, true }, - { 118489, true }, - { 118504, true }, - { 118518, true }, - { 118531, true }, - { 118542, true }, - { 118559, true }, - { 118573, true }, - { 118583, true }, - { 118595, true }, - { 118613, true }, - { 118627, true }, + { 117527, true }, + { 117534, true }, + { 117548, true }, + { 117556, true }, + { 117563, true }, + { 117574, true }, + { 117580, true }, + { 117592, true }, + { 117605, true }, + { 117618, true }, + { 117628, true }, + { 117638, true }, + { 117651, true }, + { 117665, true }, + { 117680, true }, + { 117693, true }, + { 117706, true }, + { 117715, true }, + { 117734, true }, + { 117759, false }, + { 117771, true }, + { 117779, true }, + { 117793, true }, + { 117806, true }, + { 117821, true }, + { 117840, true }, + { 117853, true }, + { 117868, true }, + { 117881, true }, + { 117892, true }, + { 117905, true }, + { 117922, true }, + { 117936, false }, + { 117955, true }, + { 117970, true }, + { 117982, true }, + { 117990, true }, + { 118002, true }, + { 118016, true }, + { 118032, true }, + { 118048, true }, + { 118064, true }, + { 118079, true }, + { 118099, true }, + { 118117, true }, + { 118126, true }, + { 118142, true }, + { 118157, true }, + { 118171, true }, + { 118184, true }, + { 118204, true }, + { 118223, true }, + { 118240, true }, + { 118256, true }, + { 118276, true }, + { 118289, true }, + { 118303, false }, + { 118316, true }, + { 118326, true }, + { 118338, true }, + { 118355, true }, + { 118370, true }, + { 118393, true }, + { 118406, true }, + { 118423, true }, + { 118437, true }, + { 118449, true }, + { 118464, true }, + { 118481, true }, + { 118495, true }, + { 118510, true }, + { 118519, true }, + { 118534, true }, + { 118552, true }, + { 118566, true }, + { 118576, true }, + { 118587, true }, + { 118597, true }, + { 118612, true }, + { 118626, true }, { 118639, true }, - { 118654, false }, - { 118669, true }, - { 118685, true }, - { 118704, true }, - { 118715, true }, - { 118727, true }, - { 118745, true }, - { 118757, true }, - { 118768, true }, - { 118785, true }, - { 118801, true }, - { 118820, true }, - { 118838, true }, - { 118855, true }, - { 118873, true }, - { 118895, true }, - { 118914, true }, - { 118927, true }, - { 118943, true }, - { 118956, true }, - { 118973, true }, - { 118988, true }, - { 118996, true }, - { 119010, true }, - { 119021, true }, - { 119031, true }, - { 119049, true }, - { 119067, true }, - { 119080, true }, - { 119090, true }, + { 118650, true }, + { 118667, true }, + { 118681, true }, + { 118691, true }, + { 118703, true }, + { 118721, true }, + { 118735, true }, + { 118747, true }, + { 118762, false }, + { 118777, true }, + { 118793, true }, + { 118812, true }, + { 118823, true }, + { 118835, true }, + { 118853, true }, + { 118865, true }, + { 118876, true }, + { 118893, true }, + { 118909, true }, + { 118928, true }, + { 118946, true }, + { 118963, true }, + { 118981, true }, + { 119003, true }, + { 119022, true }, + { 119035, true }, + { 119051, true }, + { 119064, true }, + { 119081, true }, + { 119096, true }, { 119104, true }, - { 119112, true }, - { 119125, true }, - { 119138, true }, - { 119150, true }, - { 119161, true }, - { 119176, true }, - { 119186, true }, - { 119197, true }, - { 119205, true }, + { 119118, true }, + { 119129, true }, + { 119139, true }, + { 119157, true }, + { 119175, true }, + { 119188, true }, + { 119198, true }, + { 119212, true }, { 119220, true }, - { 119227, true }, - { 119243, true }, - { 119265, true }, - { 119281, true }, - { 119290, true }, - { 119298, true }, - { 119308, true }, - { 119320, true }, - { 119333, true }, + { 119233, true }, + { 119246, true }, + { 119258, true }, + { 119269, true }, + { 119284, true }, + { 119294, true }, + { 119305, true }, + { 119313, true }, + { 119328, true }, + { 119335, true }, { 119351, true }, - { 119376, true }, - { 119390, true }, - { 119409, true }, - { 119423, true }, - { 119436, true }, - { 119444, true }, - { 119460, false }, - { 119477, true }, + { 119373, true }, + { 119389, true }, + { 119398, true }, + { 119406, true }, + { 119416, true }, + { 119428, true }, + { 119441, true }, + { 119459, true }, + { 119484, true }, { 119498, true }, { 119517, true }, - { 119536, true }, - { 119555, true }, - { 119571, true }, - { 119586, true }, - { 119596, true }, + { 119531, true }, + { 119544, true }, + { 119552, true }, + { 119568, false }, + { 119585, true }, { 119606, true }, - { 119615, true }, - { 119628, true }, - { 119638, false }, - { 119656, true }, - { 119678, true }, - { 119695, true }, - { 119711, true }, - { 119729, true }, - { 119742, true }, - { 119753, true }, - { 119769, true }, - { 119787, true }, + { 119625, true }, + { 119644, true }, + { 119663, true }, + { 119679, true }, + { 119694, true }, + { 119704, true }, + { 119714, true }, + { 119723, true }, + { 119736, true }, + { 119746, false }, + { 119764, true }, + { 119786, true }, { 119803, true }, { 119819, true }, - { 119834, false }, - { 119848, true }, - { 119865, true }, - { 119884, true }, + { 119837, true }, + { 119850, true }, + { 119861, true }, + { 119877, true }, { 119895, true }, { 119911, true }, - { 119928, true }, - { 119945, true }, - { 119961, true }, - { 119974, true }, + { 119927, true }, + { 119942, false }, + { 119956, true }, + { 119973, true }, { 119992, true }, - { 120005, true }, - { 120016, true }, - { 120033, true }, - { 120055, false }, - { 120072, true }, - { 120088, true }, - { 120102, true }, - { 120114, true }, - { 120136, false }, - { 120151, true }, - { 120158, true }, - { 120170, true }, - { 120178, true }, - { 120191, true }, - { 120206, true }, - { 120221, true }, - { 120231, true }, - { 120244, true }, - { 120256, true }, - { 120265, true }, - { 120275, true }, - { 120298, true }, - { 120313, false }, - { 120327, true }, - { 120341, true }, - { 120352, false }, - { 120365, true }, - { 120379, true }, - { 120387, true }, - { 120396, true }, - { 120409, true }, - { 120418, true }, - { 120428, true }, - { 120441, true }, - { 120461, false }, - { 120471, true }, + { 120003, true }, + { 120019, true }, + { 120036, true }, + { 120053, true }, + { 120069, true }, + { 120082, true }, + { 120100, true }, + { 120113, true }, + { 120124, true }, + { 120141, true }, + { 120163, false }, + { 120180, true }, + { 120196, true }, + { 120210, true }, + { 120222, true }, + { 120244, false }, + { 120259, true }, + { 120266, true }, + { 120278, true }, + { 120286, true }, + { 120299, true }, + { 120314, true }, + { 120329, true }, + { 120339, true }, + { 120352, true }, + { 120364, true }, + { 120373, true }, + { 120383, true }, + { 120406, true }, + { 120421, true }, + { 120435, true }, + { 120449, true }, + { 120460, false }, + { 120473, true }, { 120487, true }, - { 120500, true }, - { 120513, true }, - { 120524, true }, - { 120533, true }, - { 120540, true }, - { 120556, true }, - { 120569, true }, - { 120582, true }, + { 120495, true }, + { 120504, true }, + { 120517, true }, + { 120526, true }, + { 120536, true }, + { 120549, true }, + { 120569, false }, + { 120579, true }, { 120595, true }, - { 120610, true }, - { 120629, true }, - { 120640, true }, - { 120647, true }, - { 120667, true }, - { 120679, true }, - { 120691, true }, - { 120698, true }, - { 120705, true }, - { 120714, true }, - { 120723, true }, - { 120732, true }, - { 120741, true }, - { 120752, true }, - { 120766, true }, - { 120779, true }, + { 120608, true }, + { 120621, true }, + { 120632, true }, + { 120641, true }, + { 120648, true }, + { 120664, true }, + { 120677, true }, + { 120690, true }, + { 120703, true }, + { 120718, true }, + { 120737, true }, + { 120748, true }, + { 120755, true }, + { 120775, true }, { 120787, true }, + { 120799, true }, { 120806, true }, - { 120817, true }, + { 120813, true }, + { 120822, true }, { 120831, true }, - { 120842, true }, - { 120858, true }, - { 120872, true }, - { 120885, true }, - { 120900, true }, + { 120840, true }, + { 120849, true }, + { 120860, true }, + { 120874, true }, + { 120887, true }, + { 120895, true }, { 120914, true }, - { 120924, false }, - { 120938, true }, - { 120948, true }, - { 120963, true }, - { 120977, false }, - { 120992, false }, + { 120925, true }, + { 120939, true }, + { 120950, true }, + { 120966, true }, + { 120980, true }, + { 120993, true }, { 121008, true }, - { 121020, true }, - { 121033, true }, - { 121052, true }, - { 121076, true }, - { 121092, false }, - { 121105, true }, - { 121121, true }, - { 121135, true }, - { 121150, true }, - { 121169, true }, - { 121186, true }, - { 121203, true }, + { 121022, true }, + { 121032, false }, + { 121046, true }, + { 121056, true }, + { 121071, true }, + { 121085, false }, + { 121100, false }, + { 121116, true }, + { 121128, true }, + { 121141, true }, + { 121160, true }, + { 121184, true }, + { 121200, false }, { 121213, true }, - { 121228, true }, - { 121242, true }, - { 121255, true }, - { 121271, true }, - { 121286, true }, - { 121302, true }, - { 121316, true }, - { 121330, true }, - { 121345, true }, - { 121353, true }, - { 121368, true }, - { 121387, true }, - { 121402, true }, - { 121426, true }, - { 121442, true }, - { 121457, true }, - { 121475, true }, - { 121494, true }, - { 121513, true }, - { 121526, false }, - { 121549, true }, + { 121229, true }, + { 121243, true }, + { 121258, true }, + { 121277, true }, + { 121294, true }, + { 121311, true }, + { 121321, true }, + { 121336, true }, + { 121350, true }, + { 121363, true }, + { 121379, true }, + { 121394, true }, + { 121410, true }, + { 121424, true }, + { 121438, true }, + { 121453, true }, + { 121461, true }, + { 121476, true }, + { 121495, true }, + { 121510, true }, + { 121534, true }, + { 121550, true }, { 121565, true }, - { 121576, true }, - { 121589, true }, - { 121604, true }, - { 121619, true }, - { 121634, true }, - { 121650, true }, - { 121665, true }, - { 121681, true }, - { 121698, true }, - { 121710, true }, - { 121724, true }, - { 121734, true }, - { 121752, true }, - { 121771, true }, - { 121781, true }, - { 121792, true }, - { 121802, true }, - { 121816, true }, - { 121829, true }, - { 121857, true }, - { 121869, true }, - { 121882, true }, - { 121895, true }, + { 121583, true }, + { 121602, true }, + { 121621, true }, + { 121634, false }, + { 121657, true }, + { 121673, true }, + { 121684, true }, + { 121697, true }, + { 121712, true }, + { 121727, true }, + { 121742, true }, + { 121758, true }, + { 121773, true }, + { 121789, true }, + { 121806, true }, + { 121818, true }, + { 121832, true }, + { 121842, true }, + { 121860, true }, + { 121879, true }, + { 121889, true }, + { 121900, true }, { 121910, true }, { 121924, true }, - { 121941, true }, - { 121955, true }, - { 121972, false }, - { 121989, true }, + { 121937, true }, + { 121965, true }, + { 121977, true }, + { 121990, true }, { 122003, true }, { 122018, true }, - { 122035, true }, - { 122052, true }, - { 122069, true }, - { 122077, true }, - { 122089, true }, - { 122110, true }, - { 122121, true }, - { 122135, true }, - { 122147, true }, - { 122163, true }, - { 122176, true }, - { 122202, true }, - { 122228, true }, - { 122238, true }, - { 122251, true }, - { 122261, true }, - { 122274, true }, - { 122282, true }, - { 122297, true }, - { 122311, true }, - { 122325, true }, + { 122032, true }, + { 122049, true }, + { 122063, true }, + { 122080, false }, + { 122097, true }, + { 122111, true }, + { 122126, true }, + { 122143, true }, + { 122160, true }, + { 122177, true }, + { 122185, true }, + { 122197, true }, + { 122218, true }, + { 122229, true }, + { 122243, true }, + { 122255, true }, + { 122271, true }, + { 122284, true }, + { 122310, true }, { 122336, true }, - { 122356, true }, - { 122374, true }, - { 122391, true }, - { 122406, true }, - { 122424, true }, - { 122440, true }, - { 122448, true }, - { 122462, true }, - { 122479, true }, - { 122490, true }, - { 122500, true }, - { 122516, true }, - { 122529, true }, - { 122539, false }, - { 122553, true }, - { 122564, true }, - { 122580, true }, - { 122588, true }, + { 122346, true }, + { 122359, true }, + { 122369, true }, + { 122382, true }, + { 122390, true }, + { 122405, true }, + { 122419, true }, + { 122433, true }, + { 122444, true }, + { 122464, true }, + { 122482, true }, + { 122499, true }, + { 122514, true }, + { 122532, true }, + { 122548, true }, + { 122556, true }, + { 122570, true }, + { 122587, true }, { 122598, true }, - { 122613, true }, - { 122629, true }, - { 122648, true }, + { 122608, true }, + { 122624, true }, + { 122637, true }, + { 122647, false }, { 122661, true }, - { 122675, true }, - { 122693, true }, - { 122713, true }, - { 122728, true }, - { 122746, true }, - { 122765, true }, - { 122778, true }, - { 122788, true }, - { 122805, true }, - { 122820, true }, - { 122831, true }, - { 122849, true }, - { 122868, true }, - { 122887, true }, - { 122898, true }, - { 122911, true }, - { 122919, true }, - { 122928, true }, - { 122945, true }, - { 122956, true }, - { 122970, true }, - { 122980, true }, - { 123003, true }, - { 123016, true }, - { 123024, true }, - { 123036, false }, - { 123047, true }, - { 123061, true }, - { 123089, true }, - { 123098, true }, - { 123113, true }, - { 123132, true }, - { 123156, true }, - { 123171, true }, - { 123191, true }, - { 123209, true }, - { 123222, true }, - { 123237, true }, - { 123250, true }, - { 123264, true }, - { 123275, true }, - { 123296, true }, - { 123309, true }, - { 123323, true }, + { 122672, true }, + { 122688, true }, + { 122696, true }, + { 122706, true }, + { 122721, true }, + { 122737, true }, + { 122756, true }, + { 122769, true }, + { 122783, true }, + { 122801, true }, + { 122821, true }, + { 122836, true }, + { 122854, true }, + { 122873, true }, + { 122886, true }, + { 122903, true }, + { 122918, true }, + { 122929, true }, + { 122947, true }, + { 122966, true }, + { 122985, true }, + { 122996, true }, + { 123009, true }, + { 123017, true }, + { 123026, true }, + { 123043, true }, + { 123054, true }, + { 123068, true }, + { 123078, true }, + { 123101, true }, + { 123114, true }, + { 123122, true }, + { 123134, false }, + { 123145, true }, + { 123159, true }, + { 123187, true }, + { 123196, true }, + { 123211, true }, + { 123230, true }, + { 123254, true }, + { 123269, true }, + { 123289, true }, + { 123307, true }, + { 123320, true }, { 123335, true }, - { 123352, true }, + { 123348, true }, { 123362, true }, - { 123375, true }, - { 123386, true }, - { 123401, true }, - { 123409, true }, - { 123429, true }, - { 123440, true }, + { 123373, true }, + { 123394, true }, + { 123407, true }, + { 123421, true }, + { 123433, true }, { 123450, true }, { 123460, true }, - { 123476, true }, - { 123485, true }, - { 123496, true }, - { 123509, true }, - { 123519, true }, - { 123529, true }, - { 123541, true }, - { 123556, true }, - { 123565, true }, - { 123579, true }, - { 123592, true }, + { 123473, true }, + { 123484, true }, + { 123499, true }, + { 123507, true }, + { 123527, true }, + { 123538, true }, + { 123548, true }, + { 123558, true }, + { 123574, true }, + { 123583, true }, + { 123594, true }, { 123607, true }, - { 123621, true }, - { 123632, true }, - { 123647, true }, - { 123657, false }, - { 123667, true }, - { 123695, true }, - { 123708, true }, - { 123727, true }, - { 123740, true }, - { 123749, true }, - { 123760, true }, - { 123774, true }, - { 123788, true }, - { 123808, true }, - { 123824, true }, - { 123835, true }, - { 123846, true }, - { 123862, true }, - { 123879, true }, - { 123894, true }, - { 123915, true }, - { 123928, true }, - { 123945, true }, - { 123955, true }, - { 123965, true }, - { 123973, true }, - { 123984, true }, - { 123994, true }, - { 124009, true }, - { 124021, true }, - { 124034, true }, - { 124048, true }, - { 124060, true }, - { 124070, true }, - { 124078, true }, - { 124091, true }, - { 124110, true }, - { 124135, true }, - { 124155, true }, - { 124164, true }, - { 124178, true }, - { 124192, true }, - { 124234, true }, - { 124250, true }, - { 124264, true }, - { 124273, true }, - { 124285, true }, - { 124297, true }, - { 124310, true }, - { 124323, true }, - { 124341, true }, - { 124349, true }, - { 124362, true }, - { 124373, true }, - { 124387, true }, - { 124397, true }, - { 124407, true }, - { 124419, true }, - { 124430, true }, - { 124445, true }, - { 124462, true }, - { 124477, true }, - { 124489, true }, - { 124502, true }, - { 124514, true }, - { 124529, true }, - { 124542, true }, - { 124554, true }, - { 124564, true }, + { 123617, true }, + { 123627, true }, + { 123639, true }, + { 123654, true }, + { 123663, true }, + { 123677, true }, + { 123690, true }, + { 123705, true }, + { 123719, true }, + { 123730, true }, + { 123745, true }, + { 123755, false }, + { 123765, true }, + { 123793, true }, + { 123806, true }, + { 123825, true }, + { 123838, true }, + { 123847, true }, + { 123858, true }, + { 123872, true }, + { 123886, true }, + { 123906, true }, + { 123922, true }, + { 123933, true }, + { 123944, true }, + { 123960, true }, + { 123977, true }, + { 123992, true }, + { 124005, true }, + { 124026, true }, + { 124039, true }, + { 124056, true }, + { 124066, true }, + { 124076, true }, + { 124084, true }, + { 124095, true }, + { 124105, true }, + { 124120, true }, + { 124132, true }, + { 124145, true }, + { 124159, true }, + { 124171, true }, + { 124181, true }, + { 124189, true }, + { 124202, true }, + { 124221, true }, + { 124246, true }, + { 124266, true }, + { 124275, true }, + { 124289, true }, + { 124303, true }, + { 124345, true }, + { 124361, true }, + { 124375, true }, + { 124384, true }, + { 124396, true }, + { 124408, true }, + { 124421, true }, + { 124434, true }, + { 124452, true }, + { 124460, true }, + { 124473, true }, + { 124484, true }, + { 124498, true }, + { 124508, true }, + { 124518, true }, + { 124530, true }, + { 124541, true }, + { 124556, true }, { 124573, true }, - { 124586, true }, - { 124604, true }, - { 124619, true }, - { 124633, true }, - { 124651, true }, - { 124669, true }, - { 124681, true }, - { 124692, true }, - { 124709, true }, - { 124727, true }, - { 124738, true }, - { 124752, true }, - { 124772, true }, - { 124785, true }, - { 124797, true }, - { 124817, true }, - { 124826, true }, - { 124835, true }, - { 124842, true }, - { 124857, true }, - { 124872, true }, - { 124886, true }, - { 124898, true }, - { 124917, true }, - { 124941, true }, - { 124952, true }, - { 124966, true }, - { 124978, true }, - { 124991, true }, - { 125004, true }, - { 125015, true }, + { 124588, true }, + { 124600, true }, + { 124613, true }, + { 124625, true }, + { 124640, true }, + { 124653, true }, + { 124665, true }, + { 124675, true }, + { 124691, true }, + { 124700, true }, + { 124713, true }, + { 124731, true }, + { 124746, true }, + { 124760, true }, + { 124778, true }, + { 124796, true }, + { 124808, true }, + { 124819, true }, + { 124836, true }, + { 124854, true }, + { 124865, true }, + { 124879, true }, + { 124899, true }, + { 124912, true }, + { 124924, true }, + { 124944, true }, + { 124953, true }, + { 124962, true }, + { 124969, true }, + { 124984, true }, + { 124999, true }, + { 125013, true }, { 125025, true }, - { 125038, true }, - { 125050, true }, - { 125073, true }, - { 125082, true }, - { 125099, true }, - { 125109, true }, - { 125121, true }, - { 125132, true }, - { 125143, true }, - { 125158, true }, - { 125172, true }, - { 125180, true }, - { 125194, true }, - { 125208, true }, - { 125216, true }, - { 125229, true }, - { 125240, true }, - { 125252, true }, - { 125263, true }, - { 125287, true }, - { 125295, true }, - { 125305, true }, - { 125315, true }, - { 125332, true }, + { 125044, true }, + { 125068, true }, + { 125079, true }, + { 125093, true }, + { 125105, true }, + { 125118, true }, + { 125131, true }, + { 125142, true }, + { 125152, true }, + { 125165, true }, + { 125177, true }, + { 125200, true }, + { 125209, true }, + { 125226, true }, + { 125236, true }, + { 125248, true }, + { 125259, true }, + { 125270, true }, + { 125285, true }, + { 125299, true }, + { 125307, true }, + { 125321, true }, + { 125335, true }, { 125343, true }, - { 125361, true }, + { 125356, true }, + { 125367, true }, { 125379, true }, - { 125393, true }, - { 125403, true }, - { 125415, true }, - { 125439, true }, - { 125453, true }, - { 125472, true }, - { 125484, true }, - { 125503, true }, + { 125390, true }, + { 125414, true }, + { 125422, true }, + { 125432, true }, + { 125442, true }, + { 125459, true }, + { 125470, true }, + { 125488, true }, + { 125506, true }, { 125520, true }, - { 125535, true }, - { 125545, true }, - { 125560, true }, + { 125530, true }, + { 125542, true }, + { 125566, true }, { 125580, true }, - { 125592, true }, - { 125604, true }, - { 125617, true }, - { 125626, true }, - { 125635, true }, - { 125644, true }, - { 125656, true }, - { 125663, true }, - { 125691, true }, - { 125718, true }, + { 125599, true }, + { 125611, true }, + { 125630, true }, + { 125647, true }, + { 125662, true }, + { 125672, true }, + { 125687, true }, + { 125707, true }, + { 125719, true }, + { 125731, true }, { 125744, true }, - { 125769, true }, - { 125779, true }, - { 125788, true }, - { 125803, true }, - { 125818, false }, - { 125836, true }, - { 125847, true }, - { 125859, true }, - { 125875, true }, - { 125889, true }, - { 125904, true }, - { 125920, true }, - { 125946, true }, - { 125957, true }, - { 125972, true }, - { 125987, true }, + { 125753, true }, + { 125762, true }, + { 125771, true }, + { 125783, true }, + { 125790, true }, + { 125818, true }, + { 125845, true }, + { 125871, true }, + { 125896, true }, + { 125906, true }, + { 125915, true }, + { 125930, true }, + { 125945, false }, + { 125963, true }, + { 125974, true }, + { 125986, true }, { 126002, true }, - { 126020, true }, - { 126030, true }, - { 126045, true }, - { 126060, true }, + { 126016, true }, + { 126031, true }, + { 126047, true }, { 126073, true }, - { 126089, true }, - { 126112, true }, - { 126125, true }, - { 126138, true }, - { 126151, true }, - { 126170, true }, - { 126182, true }, - { 126198, true }, - { 126212, true }, - { 126224, false }, - { 126243, true }, - { 126255, true }, - { 126270, true }, - { 126288, true }, - { 126299, true }, - { 126311, true }, - { 126322, true }, - { 126335, true }, - { 126346, true }, - { 126363, true }, - { 126386, true }, - { 126401, true }, - { 126416, true }, - { 126430, true }, - { 126442, true }, - { 126459, true }, - { 126470, true }, - { 126478, true }, - { 126494, true }, - { 126507, true }, - { 126517, true }, + { 126084, true }, + { 126099, true }, + { 126114, true }, + { 126129, true }, + { 126147, true }, + { 126157, true }, + { 126172, true }, + { 126187, true }, + { 126200, true }, + { 126216, true }, + { 126239, true }, + { 126252, true }, + { 126265, true }, + { 126278, true }, + { 126297, true }, + { 126309, true }, + { 126325, true }, + { 126339, true }, + { 126351, false }, + { 126370, true }, + { 126382, true }, + { 126397, true }, + { 126415, true }, + { 126426, true }, + { 126438, true }, + { 126449, true }, + { 126462, true }, + { 126473, true }, + { 126490, true }, + { 126513, true }, { 126528, true }, - { 126536, true }, - { 126553, true }, - { 126568, true }, - { 126578, true }, - { 126588, true }, - { 126599, true }, - { 126610, true }, - { 126630, true }, - { 126645, true }, - { 126662, true }, - { 126676, true }, - { 126689, true }, - { 126699, true }, + { 126543, true }, + { 126557, true }, + { 126569, true }, + { 126586, true }, + { 126597, true }, + { 126605, true }, + { 126621, true }, + { 126634, true }, + { 126644, true }, + { 126655, true }, + { 126663, true }, + { 126680, true }, + { 126695, true }, + { 126705, true }, { 126715, true }, - { 126738, true }, - { 126751, true }, - { 126765, true }, - { 126775, true }, - { 126786, true }, - { 126805, true }, + { 126726, true }, + { 126737, true }, + { 126757, true }, + { 126772, true }, + { 126789, true }, + { 126803, true }, { 126816, true }, - { 126838, true }, - { 126852, true }, - { 126863, true }, - { 126876, true }, - { 126886, true }, - { 126904, true }, - { 126929, true }, - { 126946, true }, - { 126960, true }, - { 126972, true }, - { 126988, true }, - { 127002, true }, + { 126826, true }, + { 126842, true }, + { 126865, true }, + { 126878, true }, + { 126892, true }, + { 126902, true }, + { 126913, true }, + { 126932, true }, + { 126943, true }, + { 126965, true }, + { 126979, true }, + { 126990, true }, + { 127003, true }, { 127013, true }, - { 127023, false }, - { 127035, true }, - { 127052, true }, - { 127069, true }, - { 127089, true }, - { 127116, true }, - { 127141, true }, - { 127157, true }, - { 127172, true }, - { 127192, true }, - { 127204, true }, - { 127220, true }, - { 127232, true }, - { 127249, true }, - { 127266, true }, - { 127286, true }, - { 127303, true }, - { 127317, true }, - { 127334, true }, - { 127347, true }, - { 127359, true }, - { 127371, true }, - { 127384, false }, - { 127398, true }, - { 127421, false }, - { 127435, true }, - { 127447, true }, - { 127458, true }, - { 127470, true }, - { 127488, true }, - { 127501, true }, - { 127516, true }, - { 127530, true }, - { 127548, true }, - { 127558, true }, - { 127570, true }, - { 127603, true }, - { 127613, true }, - { 127622, true }, + { 127031, true }, + { 127056, true }, + { 127073, true }, + { 127087, true }, + { 127099, true }, + { 127115, true }, + { 127129, true }, + { 127140, true }, + { 127150, false }, + { 127162, true }, + { 127179, true }, + { 127196, true }, + { 127216, true }, + { 127243, true }, + { 127268, true }, + { 127284, true }, + { 127299, true }, + { 127312, true }, + { 127332, true }, + { 127344, true }, + { 127360, true }, + { 127372, true }, + { 127389, true }, + { 127406, true }, + { 127426, true }, + { 127443, true }, + { 127457, true }, + { 127474, true }, + { 127487, true }, + { 127499, true }, + { 127511, true }, + { 127524, false }, + { 127538, true }, + { 127561, false }, + { 127575, true }, + { 127587, true }, + { 127598, true }, + { 127610, true }, + { 127628, true }, { 127641, true }, - { 127653, true }, - { 127667, true }, + { 127656, true }, + { 127670, true }, { 127688, true }, - { 127702, true }, - { 127716, true }, - { 127734, true }, - { 127752, true }, - { 127770, true }, - { 127782, true }, - { 127795, true }, + { 127698, true }, + { 127710, true }, + { 127743, true }, + { 127753, true }, + { 127762, true }, + { 127781, true }, + { 127793, true }, { 127807, true }, - { 127815, true }, - { 127829, true }, - { 127845, true }, - { 127860, true }, + { 127828, true }, + { 127842, true }, + { 127856, true }, { 127874, true }, - { 127885, true }, - { 127894, true }, - { 127904, true }, - { 127916, true }, - { 127931, true }, - { 127943, true }, - { 127966, true }, - { 127978, true }, - { 127991, true }, - { 127999, true }, - { 128010, true }, - { 128019, true }, - { 128027, true }, - { 128040, true }, - { 128063, true }, - { 128075, true }, - { 128091, true }, - { 128103, true }, - { 128126, true }, - { 128137, true }, - { 128153, true }, - { 128169, true }, - { 128184, true }, - { 128197, true }, - { 128207, true }, - { 128216, true }, - { 128223, true }, - { 128236, true }, - { 128253, true }, - { 128276, true }, + { 127892, true }, + { 127910, true }, + { 127922, true }, + { 127935, true }, + { 127947, true }, + { 127955, true }, + { 127969, true }, + { 127985, true }, + { 128000, true }, + { 128014, true }, + { 128025, true }, + { 128034, true }, + { 128044, true }, + { 128056, true }, + { 128071, true }, + { 128083, true }, + { 128106, true }, + { 128118, true }, + { 128131, true }, + { 128139, true }, + { 128150, true }, + { 128159, true }, + { 128167, true }, + { 128180, true }, + { 128203, true }, + { 128215, true }, + { 128231, true }, + { 128243, true }, + { 128266, true }, + { 128277, true }, { 128293, true }, - { 128311, true }, - { 128340, true }, - { 128357, true }, - { 128371, true }, - { 128387, true }, - { 128397, true }, - { 128411, true }, - { 128425, true }, - { 128437, true }, - { 128446, true }, - { 128462, true }, - { 128479, true }, - { 128495, false }, - { 128510, true }, - { 128523, true }, - { 128534, true }, - { 128552, true }, - { 128561, true }, - { 128575, true }, - { 128593, true }, - { 128611, true }, + { 128309, true }, + { 128324, true }, + { 128337, true }, + { 128347, true }, + { 128356, true }, + { 128363, true }, + { 128376, true }, + { 128393, true }, + { 128416, true }, + { 128433, true }, + { 128451, true }, + { 128480, true }, + { 128497, true }, + { 128511, true }, + { 128527, true }, + { 128537, true }, + { 128551, true }, + { 128565, true }, + { 128577, true }, + { 128586, true }, + { 128602, true }, { 128619, true }, - { 128629, true }, - { 128637, true }, - { 128647, true }, - { 128658, true }, - { 128668, true }, - { 128682, true }, - { 128690, true }, - { 128702, true }, - { 128716, true }, - { 128734, true }, - { 128743, true }, - { 128754, true }, - { 128767, true }, - { 128782, true }, - { 128800, true }, + { 128635, false }, + { 128650, true }, + { 128663, true }, + { 128674, true }, + { 128692, true }, + { 128701, true }, + { 128715, true }, + { 128733, true }, + { 128751, true }, + { 128759, true }, + { 128769, true }, + { 128777, true }, + { 128787, true }, + { 128798, true }, { 128808, true }, - { 128823, true }, - { 128836, true }, - { 128854, true }, - { 128872, true }, - { 128884, true }, + { 128822, true }, + { 128830, true }, + { 128842, true }, + { 128856, true }, + { 128874, true }, + { 128883, true }, { 128894, true }, - { 128905, true }, - { 128917, true }, - { 128931, true }, - { 128943, true }, - { 128957, true }, - { 128972, true }, - { 128983, true }, + { 128907, true }, + { 128922, true }, + { 128940, true }, + { 128948, true }, + { 128963, true }, + { 128976, true }, { 128994, true }, - { 129008, true }, - { 129032, false }, - { 129053, true }, - { 129070, true }, - { 129088, true }, - { 129105, true }, - { 129122, true }, - { 129137, true }, - { 129151, true }, - { 129163, true }, - { 129171, true }, - { 129186, true }, - { 129194, true }, - { 129207, true }, - { 129215, true }, - { 129233, true }, - { 129257, true }, - { 129274, true }, - { 129289, true }, - { 129302, true }, - { 129325, false }, - { 129341, true }, - { 129354, true }, - { 129368, true }, - { 129380, true }, - { 129391, true }, - { 129402, true }, - { 129412, true }, - { 129423, false }, - { 129444, false }, - { 129455, true }, - { 129469, true }, + { 129012, true }, + { 129024, true }, + { 129034, true }, + { 129045, true }, + { 129057, true }, + { 129071, true }, + { 129083, true }, + { 129097, true }, + { 129112, true }, + { 129123, true }, + { 129134, true }, + { 129148, true }, + { 129172, false }, + { 129193, true }, + { 129210, true }, + { 129228, true }, + { 129245, true }, + { 129262, true }, + { 129277, true }, + { 129291, true }, + { 129303, true }, + { 129311, true }, + { 129326, true }, + { 129334, true }, + { 129347, true }, + { 129355, true }, + { 129373, true }, + { 129397, true }, + { 129414, true }, + { 129429, true }, + { 129442, true }, + { 129465, false }, { 129481, true }, - { 129495, true }, - { 129513, true }, - { 129527, true }, - { 129538, true }, - { 129555, true }, - { 129566, true }, - { 129576, true }, - { 129596, true }, - { 129607, true }, + { 129494, true }, + { 129508, true }, + { 129520, true }, + { 129531, true }, + { 129542, true }, + { 129552, true }, + { 129563, false }, + { 129584, false }, + { 129595, true }, + { 129609, true }, { 129621, true }, { 129635, true }, - { 129646, true }, - { 129659, true }, - { 129670, true }, - { 129689, true }, - { 129705, true }, - { 129718, true }, - { 129726, true }, - { 129740, false }, - { 129753, true }, - { 129765, true }, - { 129778, true }, - { 129791, true }, - { 129803, true }, - { 129815, true }, - { 129830, true }, + { 129653, true }, + { 129667, true }, + { 129678, true }, + { 129695, true }, + { 129706, true }, + { 129716, true }, + { 129736, true }, + { 129747, true }, + { 129761, true }, + { 129775, true }, + { 129786, true }, + { 129799, true }, + { 129810, true }, + { 129829, true }, { 129845, true }, - { 129855, true }, - { 129870, true }, - { 129884, true }, - { 129897, true }, - { 129907, false }, + { 129858, true }, + { 129866, true }, + { 129880, false }, + { 129893, true }, + { 129905, true }, { 129918, true }, - { 129940, true }, - { 129954, true }, - { 129967, true }, - { 129978, true }, - { 129988, true }, - { 129998, true }, - { 130009, true }, - { 130021, true }, - { 130031, true }, - { 130042, true }, - { 130053, true }, - { 130066, true }, - { 130078, true }, - { 130088, true }, - { 130100, true }, - { 130110, true }, + { 129931, true }, + { 129943, true }, + { 129955, true }, + { 129970, true }, + { 129985, true }, + { 129995, true }, + { 130010, true }, + { 130024, true }, + { 130037, true }, + { 130047, false }, + { 130058, true }, + { 130080, true }, + { 130094, true }, + { 130107, true }, { 130118, true }, - { 130140, true }, - { 130152, true }, + { 130128, true }, + { 130138, true }, + { 130149, true }, { 130161, true }, - { 130177, true }, - { 130186, true }, - { 130198, true }, - { 130210, true }, - { 130220, true }, - { 130230, true }, - { 130241, true }, - { 130251, true }, - { 130264, false }, - { 130275, true }, - { 130288, false }, - { 130313, true }, - { 130325, true }, - { 130334, true }, - { 130343, true }, + { 130171, true }, + { 130182, true }, + { 130193, true }, + { 130206, true }, + { 130218, true }, + { 130228, true }, + { 130240, true }, + { 130250, true }, + { 130258, true }, + { 130280, true }, + { 130292, true }, + { 130301, true }, + { 130317, true }, + { 130326, true }, + { 130338, true }, + { 130350, true }, { 130360, true }, - { 130378, true }, - { 130386, true }, - { 130405, true }, - { 130418, true }, - { 130432, true }, - { 130442, true }, - { 130461, true }, - { 130484, true }, - { 130503, true }, - { 130515, true }, - { 130529, true }, - { 130547, true }, - { 130565, true }, - { 130579, true }, - { 130597, true }, - { 130613, true }, - { 130632, true }, - { 130642, false }, + { 130370, true }, + { 130381, true }, + { 130391, true }, + { 130404, false }, + { 130415, true }, + { 130428, false }, + { 130453, true }, + { 130465, true }, + { 130474, true }, + { 130483, true }, + { 130500, true }, + { 130518, true }, + { 130526, true }, + { 130545, true }, + { 130558, true }, + { 130572, true }, + { 130582, true }, + { 130601, true }, + { 130624, true }, + { 130643, true }, { 130655, true }, - { 130666, true }, - { 130676, true }, - { 130689, true }, - { 130698, true }, - { 130709, true }, - { 130721, true }, - { 130731, false }, - { 130744, true }, - { 130754, true }, - { 130762, true }, - { 130774, true }, - { 130786, true }, - { 130794, true }, + { 130679, true }, + { 130693, true }, + { 130711, true }, + { 130729, true }, + { 130743, true }, + { 130761, true }, + { 130777, true }, + { 130796, true }, { 130806, true }, - { 130821, true }, - { 130830, true }, - { 130845, true }, - { 130851, true }, + { 130829, false }, + { 130842, true }, + { 130853, true }, { 130863, true }, - { 130873, true }, - { 130882, true }, - { 130892, true }, - { 130899, false }, - { 130914, true }, - { 130925, true }, - { 130936, true }, - { 130954, true }, - { 130969, true }, - { 130982, true }, - { 130995, true }, - { 131009, true }, - { 131021, true }, - { 131035, true }, - { 131048, true }, - { 131062, true }, - { 131073, true }, - { 131082, true }, - { 131097, true }, - { 131116, true }, - { 131126, true }, - { 131138, true }, - { 131151, true }, - { 131159, true }, - { 131172, true }, - { 131184, true }, - { 131197, true }, - { 131217, true }, - { 131236, true }, - { 131252, true }, + { 130876, true }, + { 130885, true }, + { 130896, true }, + { 130908, true }, + { 130918, false }, + { 130931, true }, + { 130941, true }, + { 130949, true }, + { 130961, true }, + { 130973, true }, + { 130981, true }, + { 130993, true }, + { 131008, true }, + { 131017, true }, + { 131032, true }, + { 131038, true }, + { 131050, true }, + { 131060, true }, + { 131069, true }, + { 131079, true }, + { 131086, false }, + { 131101, true }, + { 131112, true }, + { 131123, true }, + { 131141, true }, + { 131156, true }, + { 131169, true }, + { 131182, true }, + { 131196, true }, + { 131208, true }, + { 131222, true }, + { 131235, true }, + { 131249, true }, + { 131260, true }, { 131269, true }, - { 131281, true }, - { 131301, true }, - { 131315, true }, - { 131330, true }, - { 131345, true }, - { 131358, true }, - { 131377, true }, - { 131389, true }, - { 131401, true }, - { 131420, true }, - { 131428, true }, - { 131447, true }, - { 131465, true }, - { 131487, true }, - { 131503, true }, - { 131514, true }, - { 131529, true }, - { 131539, true }, - { 131553, true }, - { 131568, false }, - { 131579, true }, - { 131598, true }, - { 131607, false }, - { 131618, true }, - { 131626, true }, + { 131284, true }, + { 131303, true }, + { 131313, true }, + { 131325, true }, + { 131338, true }, + { 131346, true }, + { 131359, true }, + { 131371, true }, + { 131384, true }, + { 131404, true }, + { 131423, true }, + { 131439, true }, + { 131456, true }, + { 131468, true }, + { 131488, true }, + { 131502, true }, + { 131517, true }, + { 131532, true }, + { 131545, true }, + { 131564, true }, + { 131576, true }, + { 131588, true }, + { 131607, true }, + { 131615, true }, { 131634, true }, - { 131643, true }, - { 131651, true }, - { 131662, true }, + { 131652, true }, { 131674, true }, - { 131689, true }, - { 131703, true }, - { 131717, true }, - { 131728, true }, - { 131737, true }, - { 131753, true }, - { 131775, true }, - { 131787, true }, + { 131690, true }, + { 131701, true }, + { 131716, true }, + { 131726, true }, + { 131740, true }, + { 131755, false }, + { 131766, true }, + { 131785, true }, + { 131794, false }, { 131805, true }, - { 131823, true }, + { 131813, true }, + { 131821, true }, { 131830, true }, - { 131842, true }, - { 131852, true }, - { 131868, true }, - { 131875, true }, - { 131887, true }, - { 131905, true }, - { 131923, true }, - { 131943, true }, - { 131964, true }, + { 131838, true }, + { 131849, true }, + { 131861, true }, + { 131876, true }, + { 131890, true }, + { 131904, true }, + { 131915, true }, + { 131924, true }, + { 131940, true }, + { 131962, true }, { 131974, true }, - { 131997, true }, - { 132032, true }, - { 132066, true }, - { 132089, true }, - { 132144, true }, - { 132156, true }, - { 132166, true }, - { 132184, true }, - { 132199, true }, - { 132212, false }, - { 132226, true }, + { 131992, true }, + { 132010, true }, + { 132017, true }, + { 132027, true }, + { 132043, true }, + { 132050, true }, + { 132062, true }, + { 132080, true }, + { 132098, true }, + { 132118, true }, + { 132139, true }, + { 132149, true }, + { 132172, true }, + { 132207, true }, { 132241, true }, - { 132255, true }, - { 132267, false }, - { 132283, true }, - { 132308, true }, - { 132318, true }, - { 132329, true }, + { 132264, true }, + { 132319, true }, + { 132331, true }, { 132341, true }, - { 132363, true }, - { 132386, true }, - { 132396, true }, - { 132406, true }, - { 132429, false }, - { 132443, true }, - { 132461, true }, - { 132472, true }, + { 132359, true }, + { 132374, true }, + { 132387, false }, + { 132401, true }, + { 132416, true }, + { 132430, true }, + { 132442, false }, + { 132458, true }, { 132483, true }, - { 132502, true }, - { 132518, true }, - { 132531, true }, - { 132556, true }, - { 132570, true }, - { 132583, true }, - { 132612, true }, - { 132625, true }, - { 132635, true }, + { 132493, true }, + { 132504, true }, + { 132516, true }, + { 132538, true }, + { 132561, true }, + { 132571, true }, + { 132581, true }, + { 132604, false }, + { 132618, true }, + { 132636, true }, { 132647, true }, - { 132659, true }, - { 132678, true }, - { 132688, true }, - { 132702, true }, - { 132719, true }, - { 132736, true }, - { 132748, true }, - { 132762, true }, - { 132776, true }, - { 132786, true }, - { 132803, true }, - { 132815, true }, - { 132826, true }, - { 132842, true }, - { 132857, true }, - { 132869, false }, - { 132878, true }, - { 132898, true }, - { 132918, true }, - { 132934, true }, - { 132955, true }, - { 132969, true }, - { 132984, true }, - { 132996, true }, - { 133013, true }, - { 133023, true }, - { 133044, true }, - { 133058, true }, - { 133072, true }, - { 133090, true }, - { 133105, true }, - { 133117, true }, - { 133135, true }, - { 133146, true }, - { 133159, true }, - { 133171, true }, - { 133185, true }, - { 133197, true }, - { 133218, true }, - { 133237, true }, - { 133249, true }, - { 133261, true }, - { 133280, true }, - { 133292, true }, - { 133311, true }, - { 133332, true }, - { 133348, true }, - { 133361, true }, - { 133378, true }, - { 133393, true }, - { 133407, true }, - { 133420, true }, - { 133433, true }, - { 133447, true }, - { 133462, true }, - { 133474, true }, - { 133488, true }, - { 133503, true }, - { 133511, true }, - { 133521, true }, - { 133534, true }, - { 133553, true }, - { 133576, false }, - { 133589, true }, - { 133607, true }, - { 133615, true }, - { 133635, false }, - { 133653, true }, - { 133673, true }, + { 132658, true }, + { 132677, true }, + { 132693, true }, + { 132706, true }, + { 132731, true }, + { 132745, true }, + { 132758, true }, + { 132787, true }, + { 132800, true }, + { 132810, true }, + { 132822, true }, + { 132834, true }, + { 132853, true }, + { 132863, true }, + { 132877, true }, + { 132894, true }, + { 132911, true }, + { 132923, true }, + { 132937, true }, + { 132951, true }, + { 132961, true }, + { 132978, true }, + { 132990, true }, + { 133001, true }, + { 133017, true }, + { 133032, true }, + { 133044, false }, + { 133053, true }, + { 133073, true }, + { 133093, true }, + { 133109, true }, + { 133130, true }, + { 133144, true }, + { 133157, true }, + { 133172, true }, + { 133184, true }, + { 133201, true }, + { 133211, true }, + { 133232, true }, + { 133246, true }, + { 133260, true }, + { 133278, true }, + { 133293, true }, + { 133305, true }, + { 133323, true }, + { 133334, true }, + { 133347, true }, + { 133359, true }, + { 133373, true }, + { 133385, true }, + { 133406, true }, + { 133425, true }, + { 133437, true }, + { 133449, true }, + { 133468, true }, + { 133480, true }, + { 133499, true }, + { 133520, true }, + { 133536, true }, + { 133549, true }, + { 133566, true }, + { 133581, true }, + { 133595, true }, + { 133608, true }, + { 133621, true }, + { 133635, true }, + { 133650, true }, + { 133662, true }, + { 133676, true }, { 133691, true }, - { 133704, true }, - { 133719, true }, - { 133734, true }, - { 133749, true }, - { 133763, true }, - { 133778, true }, + { 133699, true }, + { 133709, true }, + { 133722, true }, + { 133741, true }, + { 133764, false }, + { 133777, true }, + { 133795, true }, { 133803, true }, - { 133814, true }, - { 133830, true }, - { 133844, true }, - { 133857, true }, - { 133885, true }, - { 133912, true }, + { 133823, false }, + { 133841, true }, + { 133861, true }, + { 133879, true }, + { 133892, true }, + { 133907, true }, + { 133922, true }, { 133937, true }, - { 133965, true }, - { 133979, true }, - { 133993, true }, - { 134012, true }, - { 134026, true }, - { 134042, true }, - { 134055, true }, - { 134066, true }, - { 134077, true }, - { 134095, true }, - { 134106, true }, - { 134118, true }, - { 134146, true }, - { 134156, true }, - { 134173, true }, - { 134190, true }, - { 134203, true }, - { 134213, true }, - { 134236, true }, - { 134246, true }, - { 134255, true }, - { 134277, true }, - { 134289, true }, - { 134300, true }, - { 134312, true }, - { 134324, true }, - { 134336, true }, - { 134347, true }, - { 134365, true }, - { 134380, true }, - { 134390, true }, - { 134399, true }, - { 134417, false }, - { 134428, true }, - { 134439, true }, - { 134463, false }, - { 134473, true }, - { 134481, true }, - { 134495, true }, - { 134507, true }, - { 134519, true }, - { 134530, true }, - { 134548, true }, + { 133951, true }, + { 133966, true }, + { 133991, true }, + { 134002, true }, + { 134018, true }, + { 134032, true }, + { 134045, true }, + { 134073, true }, + { 134100, true }, + { 134125, true }, + { 134153, true }, + { 134167, true }, + { 134181, true }, + { 134200, true }, + { 134214, true }, + { 134230, true }, + { 134243, true }, + { 134254, true }, + { 134265, true }, + { 134283, true }, + { 134294, true }, + { 134306, true }, + { 134334, true }, + { 134344, true }, + { 134361, true }, + { 134378, true }, + { 134391, true }, + { 134401, true }, + { 134424, true }, + { 134434, true }, + { 134443, true }, + { 134465, true }, + { 134477, true }, + { 134488, true }, + { 134500, true }, + { 134512, true }, + { 134524, true }, + { 134535, true }, + { 134553, true }, { 134568, true }, - { 134583, true }, - { 134600, true }, + { 134578, true }, + { 134587, true }, + { 134605, false }, { 134616, true }, - { 134629, true }, - { 134640, true }, - { 134655, true }, - { 134676, true }, - { 134694, true }, - { 134709, true }, - { 134725, true }, - { 134738, true }, - { 134763, true }, - { 134779, true }, + { 134627, true }, + { 134651, false }, + { 134661, true }, + { 134669, true }, + { 134683, true }, + { 134695, true }, + { 134707, true }, + { 134718, true }, + { 134736, true }, + { 134756, true }, + { 134771, true }, { 134788, true }, - { 134808, true }, - { 134823, true }, - { 134839, true }, - { 134850, true }, - { 134861, true }, - { 134875, true }, - { 134892, true }, - { 134904, true }, - { 134921, true }, - { 134932, true }, - { 134940, true }, - { 134953, true }, - { 134965, true }, - { 134977, true }, - { 134991, true }, - { 135001, true }, - { 135015, true }, - { 135031, true }, - { 135044, true }, - { 135060, true }, - { 135069, true }, - { 135084, true }, - { 135102, true }, - { 135121, true }, - { 135136, true }, - { 135148, true }, - { 135165, false }, - { 135185, false }, - { 135201, true }, - { 135212, true }, - { 135225, true }, - { 135238, true }, - { 135258, true }, - { 135279, true }, - { 135292, false }, - { 135313, true }, + { 134804, true }, + { 134817, true }, + { 134828, true }, + { 134843, true }, + { 134864, true }, + { 134882, true }, + { 134897, true }, + { 134913, true }, + { 134926, true }, + { 134951, true }, + { 134967, true }, + { 134976, true }, + { 134996, true }, + { 135011, true }, + { 135027, true }, + { 135038, true }, + { 135049, true }, + { 135063, true }, + { 135080, true }, + { 135092, true }, + { 135109, true }, + { 135120, true }, + { 135128, true }, + { 135141, true }, + { 135153, true }, + { 135165, true }, + { 135179, true }, + { 135189, true }, + { 135203, true }, + { 135219, true }, + { 135232, true }, + { 135248, true }, + { 135257, true }, + { 135272, true }, + { 135290, true }, + { 135309, true }, { 135324, true }, - { 135343, true }, - { 135362, true }, - { 135377, true }, - { 135388, true }, - { 135405, true }, + { 135336, true }, + { 135353, false }, + { 135373, false }, + { 135389, true }, + { 135400, true }, { 135413, true }, - { 135440, true }, - { 135451, true }, - { 135468, true }, - { 135478, true }, - { 135493, true }, - { 135505, true }, - { 135526, true }, - { 135535, true }, - { 135548, true }, - { 135561, true }, - { 135579, true }, - { 135588, true }, - { 135597, true }, - { 135606, true }, - { 135618, false }, - { 135635, false }, - { 135646, true }, - { 135664, true }, - { 135675, true }, - { 135690, true }, - { 135705, true }, - { 135721, true }, - { 135743, true }, - { 135758, true }, - { 135766, true }, - { 135779, true }, - { 135791, true }, - { 135808, true }, - { 135822, true }, - { 135832, true }, - { 135849, true }, - { 135867, true }, - { 135884, true }, - { 135901, true }, + { 135426, true }, + { 135446, true }, + { 135467, true }, + { 135480, false }, + { 135501, true }, + { 135512, true }, + { 135531, true }, + { 135550, true }, + { 135565, true }, + { 135576, true }, + { 135593, true }, + { 135601, true }, + { 135628, true }, + { 135639, true }, + { 135656, true }, + { 135666, true }, + { 135681, true }, + { 135693, true }, + { 135714, true }, + { 135723, true }, + { 135736, true }, + { 135749, true }, + { 135767, true }, + { 135776, true }, + { 135785, true }, + { 135794, true }, + { 135806, false }, + { 135823, false }, + { 135834, true }, + { 135852, true }, + { 135863, true }, + { 135878, true }, + { 135893, true }, { 135909, true }, - { 135928, true }, - { 135943, true }, - { 135967, true }, - { 135991, true }, - { 136009, true }, - { 136023, true }, - { 136041, true }, - { 136052, true }, - { 136065, true }, - { 136079, true }, - { 136093, true }, - { 136112, true }, - { 136123, true }, - { 136133, true }, - { 136144, true }, + { 135931, true }, + { 135946, true }, + { 135954, true }, + { 135966, true }, + { 135983, true }, + { 135997, true }, + { 136007, true }, + { 136024, true }, + { 136042, true }, + { 136059, true }, + { 136076, true }, + { 136084, true }, + { 136103, true }, + { 136118, true }, + { 136142, true }, { 136166, true }, - { 136178, true }, - { 136189, true }, + { 136184, true }, + { 136198, true }, { 136216, true }, - { 136228, true }, - { 136251, true }, - { 136263, true }, - { 136278, true }, - { 136299, true }, - { 136312, true }, + { 136227, true }, + { 136240, true }, + { 136254, true }, + { 136268, true }, + { 136287, true }, + { 136298, true }, + { 136308, true }, { 136319, true }, - { 136339, true }, - { 136349, true }, - { 136365, true }, - { 136375, false }, - { 136392, true }, + { 136341, true }, + { 136353, true }, + { 136364, true }, + { 136391, true }, { 136403, true }, - { 136410, true }, - { 136419, true }, + { 136426, true }, { 136438, true }, - { 136451, true }, - { 136469, true }, - { 136479, true }, - { 136499, true }, - { 136509, true }, + { 136453, true }, + { 136474, true }, + { 136487, true }, + { 136494, true }, + { 136514, true }, { 136524, true }, - { 136537, true }, - { 136547, true }, - { 136571, true }, - { 136588, true }, - { 136600, false }, - { 136615, true }, - { 136628, true }, - { 136643, true }, - { 136653, true }, - { 136671, true }, - { 136682, true }, - { 136694, true }, + { 136540, true }, + { 136550, false }, + { 136567, true }, + { 136578, true }, + { 136585, true }, + { 136594, true }, + { 136613, true }, + { 136626, true }, + { 136644, true }, + { 136654, true }, + { 136674, true }, + { 136684, true }, + { 136699, true }, { 136712, true }, - { 136733, false }, - { 136759, true }, - { 136773, true }, - { 136786, true }, - { 136800, true }, - { 136811, true }, - { 136825, true }, - { 136838, true }, - { 136850, true }, - { 136863, true }, - { 136880, true }, - { 136895, true }, - { 136907, false }, - { 136921, true }, - { 136941, true }, - { 136954, true }, - { 136967, true }, - { 136980, true }, + { 136722, true }, + { 136746, true }, + { 136763, true }, + { 136775, false }, + { 136790, true }, + { 136803, true }, + { 136818, true }, + { 136828, true }, + { 136846, true }, + { 136857, true }, + { 136869, true }, + { 136887, true }, + { 136908, false }, + { 136934, true }, + { 136948, true }, + { 136961, true }, + { 136975, true }, + { 136986, true }, { 137000, true }, - { 137010, true }, - { 137021, true }, - { 137032, true }, - { 137043, true }, + { 137013, true }, + { 137025, true }, + { 137038, true }, { 137055, true }, - { 137068, true }, - { 137092, true }, - { 137105, true }, - { 137128, true }, - { 137140, true }, - { 137154, true }, - { 137165, true }, - { 137178, true }, - { 137186, true }, - { 137198, true }, - { 137212, true }, - { 137227, true }, - { 137250, true }, - { 137261, true }, - { 137275, true }, - { 137288, false }, + { 137070, true }, + { 137082, false }, + { 137096, true }, + { 137116, true }, + { 137129, true }, + { 137142, true }, + { 137155, true }, + { 137175, true }, + { 137185, true }, + { 137196, true }, + { 137207, true }, + { 137218, true }, + { 137230, true }, + { 137243, true }, + { 137267, true }, + { 137280, true }, { 137303, true }, { 137315, true }, - { 137325, true }, - { 137341, true }, - { 137353, false }, - { 137367, true }, - { 137381, true }, - { 137393, true }, - { 137407, true }, - { 137417, true }, - { 137432, true }, - { 137446, true }, - { 137459, true }, - { 137472, true }, - { 137498, true }, - { 137508, true }, - { 137536, true }, - { 137564, true }, - { 137574, true }, - { 137601, true }, - { 137613, true }, - { 137623, true }, - { 137633, true }, - { 137646, true }, - { 137662, true }, - { 137675, true }, - { 137689, true }, - { 137705, false }, - { 137720, true }, - { 137738, true }, - { 137751, true }, - { 137770, true }, - { 137778, true }, - { 137791, true }, - { 137806, true }, - { 137820, true }, - { 137836, true }, + { 137329, true }, + { 137340, true }, + { 137353, true }, + { 137361, true }, + { 137373, true }, + { 137387, true }, + { 137402, true }, + { 137425, true }, + { 137436, true }, + { 137450, true }, + { 137463, false }, + { 137478, true }, + { 137490, true }, + { 137500, true }, + { 137516, true }, + { 137528, false }, + { 137542, true }, + { 137556, true }, + { 137568, true }, + { 137582, true }, + { 137592, true }, + { 137607, true }, + { 137621, true }, + { 137634, true }, + { 137647, true }, + { 137673, true }, + { 137683, true }, + { 137711, true }, + { 137739, true }, + { 137749, true }, + { 137776, true }, + { 137788, true }, + { 137798, true }, + { 137808, true }, + { 137821, true }, + { 137837, true }, { 137850, true }, - { 137868, true }, - { 137881, true }, - { 137891, true }, - { 137900, false }, - { 137911, true }, - { 137922, true }, - { 137932, true }, - { 137944, true }, - { 137954, true }, - { 137965, true }, - { 137992, true }, - { 138010, true }, - { 138030, true }, - { 138044, true }, - { 138055, true }, - { 138064, true }, - { 138073, true }, - { 138090, false }, - { 138104, true }, - { 138127, true }, - { 138143, true }, - { 138164, true }, - { 138180, true }, - { 138193, true }, - { 138215, true }, - { 138225, true }, - { 138233, true }, - { 138242, true }, - { 138253, true }, - { 138268, true }, - { 138282, true }, - { 138292, true }, - { 138309, true }, - { 138324, true }, - { 138338, true }, - { 138348, true }, + { 137864, true }, + { 137880, false }, + { 137895, true }, + { 137913, true }, + { 137926, true }, + { 137945, true }, + { 137953, true }, + { 137966, true }, + { 137981, true }, + { 137995, true }, + { 138011, true }, + { 138025, true }, + { 138043, true }, + { 138056, true }, + { 138066, true }, + { 138075, false }, + { 138086, true }, + { 138097, true }, + { 138107, true }, + { 138119, true }, + { 138129, true }, + { 138140, true }, + { 138167, true }, + { 138185, true }, + { 138205, true }, + { 138219, true }, + { 138230, true }, + { 138239, true }, + { 138248, true }, + { 138265, false }, + { 138279, true }, + { 138302, true }, + { 138318, true }, + { 138339, true }, + { 138355, true }, { 138368, true }, - { 138383, true }, - { 138393, true }, - { 138411, true }, - { 138426, true }, - { 138452, true }, - { 138466, true }, - { 138479, true }, - { 138491, true }, - { 138510, true }, + { 138390, true }, + { 138400, true }, + { 138408, true }, + { 138417, true }, + { 138428, true }, + { 138443, true }, + { 138457, true }, + { 138467, true }, + { 138484, true }, + { 138499, true }, + { 138513, true }, { 138523, true }, - { 138547, false }, - { 138566, true }, - { 138594, true }, - { 138608, true }, - { 138621, true }, - { 138635, true }, - { 138647, true }, - { 138661, true }, - { 138671, true }, - { 138693, true }, - { 138712, true }, - { 138730, true }, - { 138738, true }, - { 138754, true }, + { 138543, true }, + { 138558, true }, + { 138568, true }, + { 138586, true }, + { 138601, true }, + { 138627, true }, + { 138641, true }, + { 138654, true }, + { 138666, true }, + { 138685, true }, + { 138698, true }, + { 138722, false }, + { 138741, true }, { 138769, true }, - { 138777, true }, - { 138788, true }, - { 138801, true }, - { 138812, true }, - { 138828, true }, - { 138842, true }, - { 138860, true }, - { 138876, true }, - { 138890, true }, + { 138783, true }, + { 138796, true }, + { 138810, true }, + { 138822, true }, + { 138836, true }, + { 138846, true }, + { 138868, true }, + { 138887, true }, { 138905, true }, - { 138920, true }, - { 138932, true }, + { 138913, true }, + { 138929, true }, { 138944, true }, + { 138952, true }, { 138963, true }, - { 138979, false }, - { 139004, true }, - { 139023, true }, - { 139040, true }, - { 139050, true }, - { 139061, true }, - { 139073, false }, - { 139088, true }, - { 139106, true }, - { 139115, true }, - { 139122, true }, - { 139130, true }, - { 139141, true }, - { 139155, true }, - { 139168, true }, - { 139181, true }, - { 139194, true }, - { 139205, true }, - { 139218, true }, - { 139228, true }, - { 139238, true }, - { 139250, true }, - { 139258, true }, - { 139270, true }, - { 139279, true }, - { 139286, true }, - { 139296, true }, - { 139307, true }, - { 139318, true }, - { 139336, true }, - { 139350, true }, - { 139364, true }, - { 139387, true }, - { 139397, true }, - { 139408, true }, - { 139423, true }, - { 139441, true }, - { 139458, true }, - { 139472, true }, - { 139487, true }, - { 139503, true }, - { 139516, true }, - { 139532, true }, - { 139546, true }, - { 139558, true }, - { 139570, true }, - { 139582, true }, - { 139595, true }, - { 139612, true }, - { 139625, false }, - { 139636, true }, - { 139650, true }, - { 139661, true }, - { 139674, true }, - { 139689, true }, - { 139696, true }, - { 139715, true }, - { 139734, true }, - { 139760, true }, - { 139775, true }, - { 139787, true }, - { 139811, false }, - { 139826, true }, - { 139837, true }, - { 139860, false }, - { 139871, false }, - { 139882, false }, - { 139894, true }, - { 139908, true }, - { 139921, true }, + { 138976, true }, + { 138987, true }, + { 139003, true }, + { 139017, true }, + { 139035, true }, + { 139051, true }, + { 139065, true }, + { 139080, true }, + { 139095, true }, + { 139107, true }, + { 139119, true }, + { 139138, true }, + { 139154, false }, + { 139179, true }, + { 139198, true }, + { 139215, true }, + { 139225, true }, + { 139236, true }, + { 139248, false }, + { 139263, true }, + { 139281, true }, + { 139290, true }, + { 139297, true }, + { 139305, true }, + { 139316, true }, + { 139330, true }, + { 139343, true }, + { 139356, true }, + { 139369, true }, + { 139380, true }, + { 139393, true }, + { 139403, true }, + { 139413, true }, + { 139425, true }, + { 139433, true }, + { 139445, true }, + { 139454, true }, + { 139461, true }, + { 139471, true }, + { 139482, true }, + { 139493, true }, + { 139511, true }, + { 139525, true }, + { 139539, true }, + { 139562, true }, + { 139572, true }, + { 139583, true }, + { 139598, true }, + { 139616, true }, + { 139633, true }, + { 139647, true }, + { 139663, true }, + { 139676, true }, + { 139692, true }, + { 139706, true }, + { 139718, true }, + { 139730, true }, + { 139742, true }, + { 139755, true }, + { 139772, true }, + { 139785, false }, + { 139796, true }, + { 139810, true }, + { 139821, true }, + { 139836, true }, + { 139843, true }, + { 139862, true }, + { 139881, true }, + { 139907, true }, + { 139922, true }, { 139934, true }, - { 139947, true }, - { 139969, true }, - { 139979, true }, - { 139999, true }, - { 140017, true }, - { 140031, true }, - { 140048, false }, - { 140063, false }, - { 140079, true }, - { 140096, true }, - { 140107, true }, - { 140118, true }, - { 140140, true }, - { 140154, true }, - { 140174, true }, - { 140191, true }, - { 140201, true }, - { 140209, true }, - { 140220, true }, - { 140228, true }, - { 140237, true }, - { 140248, true }, - { 140258, true }, - { 140271, true }, - { 140285, true }, - { 140293, true }, - { 140303, true }, - { 140320, true }, - { 140341, true }, - { 140355, true }, - { 140372, true }, - { 140387, true }, - { 140409, true }, - { 140429, true }, - { 140444, true }, - { 140459, true }, - { 140470, true }, + { 139958, false }, + { 139973, true }, + { 139984, true }, + { 140007, false }, + { 140018, false }, + { 140029, false }, + { 140041, true }, + { 140055, true }, + { 140068, true }, + { 140081, true }, + { 140094, true }, + { 140116, true }, + { 140126, true }, + { 140146, true }, + { 140164, true }, + { 140178, true }, + { 140195, false }, + { 140210, false }, + { 140226, true }, + { 140243, true }, + { 140254, true }, + { 140265, true }, + { 140287, true }, + { 140301, true }, + { 140321, true }, + { 140338, true }, + { 140348, true }, + { 140356, true }, + { 140367, true }, + { 140375, true }, + { 140384, true }, + { 140395, true }, + { 140405, true }, + { 140420, true }, + { 140433, true }, + { 140447, true }, + { 140455, true }, + { 140465, true }, { 140482, true }, - { 140498, true }, - { 140512, true }, - { 140525, true }, - { 140538, true }, - { 140551, true }, - { 140564, true }, - { 140577, true }, - { 140596, true }, - { 140609, true }, - { 140621, false }, - { 140637, true }, - { 140650, true }, - { 140664, true }, - { 140677, true }, + { 140503, true }, + { 140517, true }, + { 140534, true }, + { 140549, true }, + { 140571, true }, + { 140591, true }, + { 140606, true }, + { 140621, true }, + { 140632, true }, + { 140644, true }, + { 140660, true }, + { 140674, true }, { 140687, true }, - { 140707, true }, - { 140730, true }, - { 140750, true }, - { 140761, true }, + { 140700, true }, + { 140713, true }, + { 140726, true }, + { 140739, true }, + { 140758, true }, { 140771, true }, - { 140786, true }, - { 140802, true }, + { 140783, false }, + { 140799, true }, { 140812, true }, - { 140829, true }, - { 140841, true }, - { 140858, true }, - { 140866, true }, - { 140882, true }, - { 140897, true }, - { 140917, true }, - { 140927, true }, - { 140941, true }, - { 140966, true }, - { 140980, true }, - { 140994, true }, - { 141008, true }, - { 141022, true }, - { 141036, true }, - { 141051, true }, - { 141065, true }, - { 141079, true }, - { 141093, true }, + { 140826, true }, + { 140839, true }, + { 140849, true }, + { 140869, true }, + { 140892, true }, + { 140912, true }, + { 140923, true }, + { 140933, true }, + { 140948, true }, + { 140964, true }, + { 140974, true }, + { 140991, true }, + { 141003, true }, + { 141020, true }, + { 141028, true }, + { 141044, true }, + { 141064, true }, + { 141074, true }, + { 141088, true }, { 141113, true }, - { 141130, true }, - { 141148, true }, - { 141163, true }, - { 141174, true }, - { 141187, true }, - { 141205, true }, - { 141220, true }, - { 141236, true }, - { 141248, true }, - { 141265, true }, - { 141278, true }, - { 141293, true }, - { 141303, true }, - { 141312, true }, - { 141325, false }, - { 141340, true }, - { 141351, true }, - { 141366, true }, - { 141378, true }, + { 141127, true }, + { 141141, true }, + { 141155, true }, + { 141169, true }, + { 141183, true }, + { 141198, true }, + { 141212, true }, + { 141226, true }, + { 141240, true }, + { 141260, true }, + { 141277, true }, + { 141295, true }, + { 141310, true }, + { 141321, true }, + { 141334, true }, + { 141352, true }, + { 141367, true }, + { 141383, true }, { 141395, true }, - { 141404, true }, - { 141416, true }, - { 141433, false }, - { 141443, true }, - { 141458, true }, - { 141474, true }, - { 141493, true }, - { 141508, true }, - { 141520, true }, - { 141536, true }, - { 141546, true }, - { 141562, true }, - { 141582, true }, - { 141596, true }, - { 141610, true }, - { 141629, true }, - { 141649, true }, - { 141661, true }, - { 141677, true }, - { 141687, true }, - { 141697, true }, - { 141711, true }, - { 141734, true }, - { 141744, true }, - { 141763, true }, - { 141780, true }, - { 141789, true }, - { 141802, true }, - { 141817, true }, - { 141831, true }, - { 141850, true }, - { 141868, true }, - { 141882, true }, - { 141897, true }, - { 141913, true }, - { 141929, true }, - { 141937, true }, - { 141948, true }, - { 141968, true }, - { 141980, true }, - { 141991, true }, - { 142003, true }, + { 141412, true }, + { 141425, true }, + { 141440, true }, + { 141450, true }, + { 141459, true }, + { 141472, false }, + { 141487, true }, + { 141498, true }, + { 141513, true }, + { 141525, true }, + { 141542, true }, + { 141551, true }, + { 141563, true }, + { 141580, false }, + { 141590, true }, + { 141605, true }, + { 141621, true }, + { 141640, true }, + { 141655, true }, + { 141667, true }, + { 141683, true }, + { 141693, true }, + { 141709, true }, + { 141729, true }, + { 141743, true }, + { 141757, true }, + { 141776, true }, + { 141796, true }, + { 141808, true }, + { 141824, true }, + { 141834, true }, + { 141844, true }, + { 141858, true }, + { 141881, true }, + { 141891, true }, + { 141910, true }, + { 141927, true }, + { 141936, true }, + { 141949, true }, + { 141964, true }, + { 141978, true }, + { 141997, true }, { 142015, true }, - { 142028, true }, - { 142041, true }, - { 142055, true }, - { 142069, true }, - { 142083, false }, - { 142109, true }, - { 142118, true }, - { 142126, true }, - { 142134, true }, - { 142142, true }, - { 142152, true }, - { 142161, true }, - { 142173, true }, - { 142192, true }, - { 142202, true }, - { 142213, true }, - { 142230, true }, - { 142243, true }, - { 142253, true }, - { 142267, true }, - { 142279, true }, - { 142290, true }, - { 142308, true }, - { 142326, true }, - { 142340, true }, - { 142350, true }, - { 142364, true }, - { 142371, true }, - { 142381, true }, - { 142396, true }, - { 142418, true }, + { 142029, true }, + { 142044, true }, + { 142060, true }, + { 142076, true }, + { 142084, true }, + { 142104, true }, + { 142116, true }, + { 142127, true }, + { 142139, true }, + { 142151, true }, + { 142164, true }, + { 142177, true }, + { 142191, true }, + { 142205, true }, + { 142219, false }, + { 142245, true }, + { 142254, true }, + { 142262, true }, + { 142270, true }, + { 142278, true }, + { 142288, true }, + { 142297, true }, + { 142309, true }, + { 142328, true }, + { 142338, true }, + { 142349, true }, + { 142366, true }, + { 142379, true }, + { 142389, true }, + { 142403, true }, + { 142415, true }, { 142426, true }, - { 142436, true }, - { 142455, true }, - { 142473, true }, - { 142485, true }, - { 142495, true }, - { 142505, true }, - { 142515, true }, - { 142527, true }, - { 142538, true }, - { 142551, true }, - { 142559, true }, - { 142573, true }, - { 142583, true }, - { 142594, true }, - { 142601, true }, + { 142444, true }, + { 142462, true }, + { 142476, true }, + { 142486, true }, + { 142500, true }, + { 142507, true }, + { 142517, true }, + { 142532, true }, + { 142554, true }, + { 142562, true }, + { 142572, true }, + { 142591, true }, { 142609, true }, - { 142627, true }, - { 142643, true }, - { 142654, true }, - { 142670, false }, - { 142685, true }, + { 142621, true }, + { 142631, true }, + { 142641, true }, + { 142651, true }, + { 142663, true }, + { 142674, true }, + { 142687, true }, { 142695, true }, - { 142703, true }, - { 142712, true }, - { 142721, true }, - { 142741, true }, - { 142750, false }, - { 142761, true }, - { 142773, true }, - { 142792, true }, - { 142805, true }, + { 142709, true }, + { 142719, true }, + { 142730, true }, + { 142737, true }, + { 142745, true }, + { 142763, true }, + { 142779, true }, + { 142790, true }, + { 142806, false }, { 142821, true }, - { 142834, true }, - { 142847, false }, - { 142858, true }, - { 142875, true }, - { 142887, true }, - { 142902, true }, - { 142912, true }, - { 142924, true }, - { 142936, true }, - { 142947, true }, - { 142958, true }, + { 142831, true }, + { 142839, true }, + { 142848, true }, + { 142857, true }, + { 142877, true }, + { 142886, false }, + { 142897, true }, + { 142909, true }, + { 142928, true }, + { 142941, true }, + { 142957, true }, { 142970, true }, - { 142993, true }, - { 143003, true }, - { 143013, true }, - { 143029, true }, - { 143044, true }, - { 143057, true }, + { 142983, false }, + { 142994, true }, + { 143011, true }, + { 143023, true }, + { 143038, true }, + { 143048, true }, + { 143060, true }, + { 143072, true }, { 143083, true }, - { 143092, true }, - { 143107, true }, - { 143117, true }, - { 143130, true }, - { 143143, true }, - { 143158, true }, - { 143168, true }, - { 143184, true }, - { 143198, false }, - { 143208, true }, - { 143222, true }, - { 143233, true }, + { 143094, true }, + { 143106, true }, + { 143129, true }, + { 143139, true }, + { 143149, true }, + { 143165, true }, + { 143180, true }, + { 143193, true }, + { 143219, true }, + { 143228, true }, { 143243, true }, - { 143257, true }, - { 143268, true }, - { 143281, true }, + { 143253, true }, + { 143266, true }, + { 143279, true }, { 143294, true }, - { 143311, true }, - { 143326, true }, - { 143338, true }, - { 143355, true }, - { 143373, true }, - { 143384, true }, - { 143399, true }, - { 143412, true }, - { 143433, true }, - { 143444, true }, - { 143459, true }, - { 143484, true }, - { 143492, true }, - { 143508, false }, - { 143523, true }, + { 143304, true }, + { 143320, true }, + { 143334, false }, + { 143344, true }, + { 143358, true }, + { 143369, true }, + { 143379, true }, + { 143393, true }, + { 143404, true }, + { 143417, true }, + { 143430, true }, + { 143447, true }, + { 143462, true }, + { 143474, true }, + { 143491, true }, + { 143509, true }, + { 143520, true }, { 143535, true }, - { 143547, true }, - { 143561, true }, - { 143575, true }, - { 143589, true }, - { 143603, true }, - { 143620, true }, - { 143647, true }, - { 143664, true }, - { 143684, true }, - { 143696, true }, - { 143706, true }, - { 143720, true }, - { 143740, true }, - { 143762, true }, - { 143776, true }, - { 143794, true }, - { 143814, true }, - { 143835, true }, - { 143852, true }, + { 143548, true }, + { 143569, true }, + { 143580, true }, + { 143604, true }, + { 143619, true }, + { 143644, true }, + { 143652, true }, + { 143668, false }, + { 143683, true }, + { 143695, true }, + { 143707, true }, + { 143721, true }, + { 143735, true }, + { 143749, true }, + { 143763, true }, + { 143780, true }, + { 143807, true }, + { 143824, true }, + { 143844, true }, + { 143856, true }, { 143866, true }, - { 143877, true }, - { 143891, true }, - { 143904, true }, - { 143915, true }, - { 143931, true }, - { 143943, true }, - { 143957, true }, + { 143880, true }, + { 143900, true }, + { 143922, true }, + { 143936, true }, + { 143954, true }, { 143974, true }, - { 143985, true }, - { 143999, true }, - { 144011, false }, - { 144036, true }, - { 144060, true }, - { 144070, false }, - { 144096, true }, - { 144113, true }, - { 144130, true }, - { 144144, true }, - { 144158, true }, - { 144188, false }, - { 144202, true }, - { 144219, true }, - { 144233, true }, - { 144256, true }, - { 144264, true }, + { 143995, true }, + { 144012, true }, + { 144026, true }, + { 144037, true }, + { 144051, true }, + { 144064, true }, + { 144075, true }, + { 144091, true }, + { 144103, true }, + { 144117, true }, + { 144133, true }, + { 144150, true }, + { 144161, true }, + { 144175, true }, + { 144187, false }, + { 144212, true }, + { 144236, true }, + { 144246, false }, { 144272, true }, - { 144280, true }, - { 144288, true }, - { 144296, true }, - { 144307, true }, - { 144317, true }, - { 144331, true }, - { 144350, true }, - { 144359, true }, - { 144372, true }, - { 144383, true }, - { 144394, true }, - { 144419, true }, - { 144431, true }, - { 144440, false }, + { 144289, true }, + { 144306, true }, + { 144320, true }, + { 144334, true }, + { 144364, false }, + { 144378, true }, + { 144395, true }, + { 144409, true }, + { 144432, true }, + { 144440, true }, + { 144448, true }, { 144456, true }, - { 144466, false }, - { 144488, true }, - { 144503, true }, - { 144517, true }, - { 144530, true }, - { 144547, true }, - { 144563, true }, - { 144586, true }, - { 144608, true }, - { 144626, true }, - { 144645, false }, + { 144464, true }, + { 144472, true }, + { 144483, true }, + { 144493, true }, + { 144507, true }, + { 144526, true }, + { 144535, true }, + { 144548, true }, + { 144559, true }, + { 144570, true }, + { 144595, true }, + { 144607, true }, + { 144616, false }, + { 144632, true }, + { 144642, false }, { 144664, true }, - { 144677, true }, - { 144690, true }, - { 144714, true }, - { 144725, true }, - { 144744, true }, - { 144761, true }, - { 144774, true }, + { 144679, true }, + { 144693, true }, + { 144706, true }, + { 144723, true }, + { 144739, true }, + { 144762, true }, + { 144784, true }, { 144802, true }, - { 144815, true }, - { 144832, true }, - { 144852, true }, - { 144863, true }, - { 144876, true }, - { 144891, true }, - { 144911, true }, - { 144931, true }, - { 144945, true }, - { 144958, true }, - { 144979, false }, - { 144990, true }, - { 145009, true }, + { 144821, false }, + { 144840, true }, + { 144853, true }, + { 144866, true }, + { 144890, true }, + { 144901, true }, + { 144920, true }, + { 144937, true }, + { 144950, true }, + { 144978, true }, + { 144991, true }, + { 145008, true }, { 145028, true }, - { 145039, false }, - { 145057, true }, - { 145069, true }, - { 145080, true }, - { 145110, true }, + { 145039, true }, + { 145052, true }, + { 145067, true }, + { 145087, true }, + { 145107, true }, { 145121, true }, - { 145135, true }, - { 145149, true }, - { 145161, true }, - { 145175, true }, - { 145195, true }, - { 145218, true }, + { 145134, true }, + { 145155, false }, + { 145166, true }, + { 145185, true }, + { 145204, true }, + { 145215, false }, { 145233, true }, - { 145244, true }, - { 145268, true }, - { 145289, true }, - { 145302, true }, - { 145319, true }, + { 145245, true }, + { 145256, true }, + { 145286, true }, + { 145297, true }, + { 145311, true }, + { 145325, true }, { 145337, true }, - { 145353, true }, + { 145351, true }, { 145371, true }, - { 145385, true }, - { 145407, true }, - { 145424, true }, - { 145438, true }, - { 145454, true }, - { 145470, true }, - { 145490, true }, - { 145501, true }, - { 145517, true }, - { 145532, true }, - { 145549, true }, - { 145572, true }, - { 145588, true }, - { 145607, true }, - { 145622, true }, - { 145637, true }, - { 145648, true }, - { 145662, true }, - { 145679, true }, - { 145695, true }, - { 145712, true }, - { 145731, true }, - { 145746, true }, - { 145757, true }, - { 145773, true }, - { 145789, true }, - { 145806, true }, - { 145818, true }, + { 145394, true }, + { 145409, true }, + { 145420, true }, + { 145444, true }, + { 145465, true }, + { 145478, true }, + { 145495, true }, + { 145513, true }, + { 145529, true }, + { 145547, true }, + { 145561, true }, + { 145583, true }, + { 145600, true }, + { 145614, true }, + { 145630, true }, + { 145646, true }, + { 145666, true }, + { 145677, true }, + { 145693, true }, + { 145708, true }, + { 145725, true }, + { 145748, true }, + { 145764, true }, + { 145783, true }, + { 145798, true }, + { 145813, true }, + { 145824, true }, { 145838, true }, - { 145853, true }, - { 145872, true }, + { 145855, true }, + { 145871, true }, { 145888, true }, - { 145898, true }, - { 145911, true }, - { 145930, true }, - { 145946, true }, - { 145966, true }, - { 145978, true }, - { 145995, true }, - { 146007, true }, - { 146020, true }, - { 146030, true }, - { 146047, true }, - { 146059, false }, - { 146069, true }, - { 146082, true }, - { 146099, true }, + { 145907, true }, + { 145922, true }, + { 145933, true }, + { 145949, true }, + { 145965, true }, + { 145982, true }, + { 145994, true }, + { 146014, true }, + { 146029, true }, + { 146048, true }, + { 146064, true }, + { 146074, true }, + { 146087, true }, + { 146106, true }, { 146122, true }, - { 146139, false }, + { 146142, true }, { 146154, true }, - { 146173, true }, - { 146198, true }, - { 146231, true }, - { 146241, true }, - { 146260, true }, - { 146274, true }, - { 146287, true }, - { 146303, true }, - { 146322, true }, - { 146352, false }, - { 146375, true }, - { 146389, true }, - { 146403, true }, - { 146415, true }, - { 146430, true }, + { 146171, true }, + { 146183, true }, + { 146196, true }, + { 146206, true }, + { 146223, true }, + { 146235, false }, + { 146245, true }, + { 146258, true }, + { 146275, true }, + { 146298, true }, + { 146315, false }, + { 146330, true }, + { 146349, true }, + { 146374, true }, + { 146407, true }, + { 146417, true }, + { 146436, true }, { 146450, true }, - { 146464, true }, - { 146476, true }, - { 146496, true }, - { 146514, true }, - { 146525, true }, - { 146540, true }, - { 146553, true }, - { 146566, true }, + { 146463, true }, + { 146479, true }, + { 146498, true }, + { 146528, false }, + { 146551, true }, + { 146565, true }, { 146579, true }, - { 146590, true }, - { 146605, true }, - { 146616, true }, - { 146632, true }, - { 146646, true }, - { 146658, true }, - { 146675, true }, - { 146689, true }, - { 146697, true }, + { 146591, true }, + { 146606, true }, + { 146626, true }, + { 146640, true }, + { 146652, true }, + { 146672, true }, + { 146690, true }, + { 146701, true }, { 146716, true }, - { 146730, true }, - { 146752, true }, - { 146769, true }, - { 146778, true }, - { 146791, true }, - { 146801, false }, - { 146813, true }, - { 146824, true }, + { 146729, true }, + { 146742, true }, + { 146755, true }, + { 146766, true }, + { 146781, true }, + { 146792, true }, + { 146808, true }, + { 146822, true }, { 146834, true }, - { 146857, true }, - { 146871, true }, - { 146886, true }, - { 146910, true }, - { 146929, true }, - { 146943, true }, - { 146957, true }, - { 146978, true }, - { 146997, true }, - { 147006, true }, - { 147016, true }, - { 147032, true }, - { 147049, true }, + { 146851, true }, + { 146865, true }, + { 146873, true }, + { 146892, true }, + { 146906, true }, + { 146928, true }, + { 146945, true }, + { 146954, true }, + { 146967, true }, + { 146977, false }, + { 146989, true }, + { 147000, true }, + { 147010, true }, + { 147033, true }, + { 147047, true }, { 147062, true }, - { 147079, true }, - { 147095, true }, - { 147114, true }, - { 147127, true }, - { 147141, true }, + { 147086, true }, + { 147105, true }, + { 147119, true }, + { 147133, true }, { 147154, true }, - { 147165, true }, { 147173, true }, - { 147189, true }, - { 147205, true }, + { 147182, true }, + { 147192, true }, + { 147208, true }, { 147225, true }, - { 147243, true }, - { 147257, true }, - { 147277, true }, - { 147293, false }, - { 147310, true }, - { 147329, true }, - { 147346, true }, - { 147360, true }, + { 147238, true }, + { 147255, true }, + { 147271, true }, + { 147290, true }, + { 147303, true }, + { 147317, true }, + { 147330, true }, + { 147341, true }, + { 147349, true }, + { 147365, true }, { 147381, true }, - { 147400, true }, - { 147418, true }, - { 147431, true }, - { 147441, true }, - { 147459, true }, - { 147472, true }, - { 147492, true }, - { 147501, true }, - { 147515, true }, - { 147532, true }, - { 147555, true }, + { 147401, true }, + { 147419, true }, + { 147433, true }, + { 147453, true }, + { 147469, false }, + { 147486, true }, + { 147505, true }, + { 147522, true }, + { 147536, true }, + { 147557, true }, { 147576, true }, - { 147585, true }, - { 147601, true }, - { 147619, true }, - { 147631, true }, - { 147644, true }, - { 147657, true }, - { 147673, true }, - { 147681, false }, - { 147693, true }, - { 147703, true }, - { 147717, true }, - { 147732, true }, - { 147742, true }, + { 147594, true }, + { 147607, true }, + { 147617, true }, + { 147635, true }, + { 147648, true }, + { 147668, true }, + { 147677, true }, + { 147691, true }, + { 147708, true }, + { 147731, true }, + { 147752, true }, { 147761, true }, - { 147776, true }, - { 147791, true }, - { 147810, true }, - { 147832, true }, - { 147851, true }, - { 147865, true }, - { 147877, true }, - { 147891, true }, - { 147904, false }, - { 147926, true }, - { 147943, true }, - { 147961, true }, - { 147978, true }, - { 147991, true }, - { 147999, true }, - { 148010, true }, - { 148024, true }, - { 148036, false }, - { 148056, true }, - { 148073, true }, - { 148081, true }, - { 148092, false }, - { 148101, false }, - { 148117, true }, - { 148132, false }, - { 148150, true }, - { 148163, true }, - { 148173, true }, - { 148184, false }, - { 148199, true }, - { 148208, true }, - { 148220, true }, - { 148229, true }, - { 148242, true }, - { 148255, true }, - { 148266, true }, - { 148280, true }, + { 147777, true }, + { 147795, true }, + { 147807, true }, + { 147820, true }, + { 147833, true }, + { 147849, true }, + { 147857, false }, + { 147869, true }, + { 147879, true }, + { 147893, true }, + { 147908, true }, + { 147918, true }, + { 147937, true }, + { 147952, true }, + { 147967, true }, + { 147986, true }, + { 148008, true }, + { 148027, true }, + { 148041, true }, + { 148053, true }, + { 148067, true }, + { 148080, false }, + { 148102, true }, + { 148119, true }, + { 148137, true }, + { 148154, true }, + { 148167, true }, + { 148175, true }, + { 148186, true }, + { 148200, true }, + { 148212, false }, + { 148232, true }, + { 148249, true }, + { 148257, true }, + { 148268, false }, + { 148277, false }, { 148293, true }, - { 148310, false }, - { 148327, true }, - { 148334, true }, - { 148342, true }, - { 148351, true }, - { 148363, true }, - { 148386, true }, - { 148400, true }, - { 148414, true }, + { 148308, false }, + { 148326, true }, + { 148339, true }, + { 148349, true }, + { 148360, false }, + { 148375, true }, + { 148384, true }, + { 148396, true }, + { 148405, true }, + { 148418, true }, { 148431, true }, { 148442, true }, - { 148456, false }, - { 148472, false }, - { 148486, true }, - { 148493, true }, + { 148456, true }, + { 148469, true }, + { 148486, false }, { 148503, true }, - { 148514, true }, - { 148529, true }, - { 148541, true }, - { 148549, true }, - { 148561, true }, - { 148576, false }, - { 148586, true }, - { 148598, true }, - { 148610, true }, - { 148622, true }, - { 148637, true }, - { 148666, true }, - { 148674, true }, - { 148682, true }, - { 148691, true }, - { 148704, true }, - { 148712, true }, - { 148722, true }, - { 148733, true }, - { 148744, true }, - { 148751, true }, - { 148760, true }, - { 148770, true }, - { 148790, true }, - { 148802, true }, - { 148814, true }, - { 148823, false }, - { 148832, true }, - { 148855, true }, - { 148875, false }, - { 148896, true }, - { 148907, true }, + { 148510, true }, + { 148518, true }, + { 148527, true }, + { 148539, true }, + { 148562, true }, + { 148576, true }, + { 148590, true }, + { 148607, true }, + { 148618, true }, + { 148632, false }, + { 148648, false }, + { 148662, true }, + { 148669, true }, + { 148679, true }, + { 148690, true }, + { 148705, true }, + { 148717, true }, + { 148725, true }, + { 148737, true }, + { 148752, false }, + { 148762, true }, + { 148774, true }, + { 148786, true }, + { 148798, true }, + { 148813, true }, + { 148842, true }, + { 148850, true }, + { 148858, true }, + { 148867, true }, + { 148880, true }, + { 148888, true }, + { 148898, true }, + { 148909, true }, { 148920, true }, - { 148929, true }, - { 148943, true }, - { 148960, true }, - { 148976, true }, - { 148994, true }, + { 148927, true }, + { 148936, true }, + { 148946, true }, + { 148966, true }, + { 148978, true }, + { 148990, true }, + { 148999, false }, { 149008, true }, - { 149025, true }, - { 149037, true }, - { 149050, true }, - { 149064, true }, - { 149082, true }, + { 149031, true }, + { 149051, false }, + { 149072, true }, + { 149083, true }, { 149096, true }, - { 149112, false }, - { 149130, true }, - { 149147, true }, - { 149169, true }, - { 149192, true }, - { 149203, true }, - { 149214, true }, - { 149228, true }, - { 149244, true }, - { 149255, true }, - { 149266, true }, - { 149278, true }, - { 149292, true }, - { 149303, true }, - { 149315, true }, - { 149331, true }, - { 149360, false }, + { 149105, true }, + { 149119, true }, + { 149136, true }, + { 149152, true }, + { 149170, true }, + { 149184, true }, + { 149201, true }, + { 149213, true }, + { 149226, true }, + { 149240, true }, + { 149258, true }, + { 149272, true }, + { 149288, false }, + { 149306, true }, + { 149323, true }, + { 149345, true }, + { 149368, true }, { 149379, true }, - { 149395, true }, - { 149421, true }, - { 149435, true }, - { 149452, true }, - { 149471, true }, - { 149488, true }, - { 149504, true }, - { 149515, true }, - { 149523, true }, - { 149535, true }, - { 149552, true }, - { 149565, true }, - { 149580, true }, - { 149593, true }, - { 149607, true }, - { 149619, true }, - { 149631, true }, - { 149645, true }, - { 149662, true }, - { 149675, true }, - { 149690, true }, - { 149703, true }, - { 149715, true }, - { 149726, true }, - { 149749, true }, - { 149767, true }, - { 149786, true }, - { 149812, true }, - { 149829, true }, - { 149857, true }, - { 149870, true }, - { 149884, true }, - { 149902, true }, - { 149919, true }, - { 149936, true }, - { 149947, true }, - { 149969, true }, - { 149991, true }, - { 150003, true }, - { 150011, true }, - { 150032, true }, - { 150053, true }, + { 149390, true }, + { 149404, true }, + { 149420, true }, + { 149431, true }, + { 149442, true }, + { 149454, true }, + { 149468, true }, + { 149479, true }, + { 149491, true }, + { 149507, true }, + { 149536, false }, + { 149555, true }, + { 149571, true }, + { 149597, true }, + { 149611, true }, + { 149628, true }, + { 149647, true }, + { 149664, true }, + { 149680, true }, + { 149691, true }, + { 149699, true }, + { 149711, true }, + { 149728, true }, + { 149741, true }, + { 149756, true }, + { 149769, true }, + { 149783, true }, + { 149795, true }, + { 149807, true }, + { 149821, true }, + { 149838, true }, + { 149851, true }, + { 149866, true }, + { 149879, true }, + { 149891, true }, + { 149905, true }, + { 149916, true }, + { 149939, true }, + { 149957, true }, + { 149976, true }, + { 150002, true }, + { 150019, true }, + { 150047, true }, + { 150060, true }, { 150074, true }, { 150092, true }, - { 150108, true }, - { 150120, true }, - { 150135, true }, - { 150147, true }, - { 150165, true }, - { 150178, true }, - { 150188, true }, - { 150202, true }, - { 150218, true }, - { 150244, false }, - { 150273, true }, - { 150284, true }, - { 150299, true }, - { 150315, true }, - { 150330, true }, - { 150359, true }, - { 150372, true }, - { 150391, true }, - { 150400, true }, - { 150414, true }, - { 150430, true }, - { 150457, true }, - { 150475, true }, - { 150502, true }, - { 150528, true }, - { 150545, false }, - { 150556, true }, - { 150566, true }, - { 150581, true }, - { 150592, true }, - { 150610, true }, - { 150623, true }, - { 150634, true }, - { 150656, true }, - { 150675, true }, - { 150689, true }, - { 150701, false }, - { 150721, true }, - { 150731, true }, - { 150745, true }, + { 150109, true }, + { 150126, true }, + { 150137, true }, + { 150159, true }, + { 150181, true }, + { 150193, true }, + { 150201, true }, + { 150222, true }, + { 150243, true }, + { 150264, true }, + { 150282, true }, + { 150298, true }, + { 150310, true }, + { 150325, true }, + { 150337, true }, + { 150355, true }, + { 150368, true }, + { 150378, true }, + { 150392, true }, + { 150408, true }, + { 150434, false }, + { 150463, true }, + { 150474, true }, + { 150489, true }, + { 150505, true }, + { 150520, true }, + { 150549, true }, + { 150562, true }, + { 150571, true }, + { 150585, true }, + { 150601, true }, + { 150628, true }, + { 150646, true }, + { 150673, true }, + { 150699, true }, + { 150716, false }, + { 150727, true }, + { 150737, true }, + { 150752, true }, { 150763, true }, - { 150777, true }, - { 150790, true }, - { 150802, true }, - { 150812, true }, - { 150824, true }, - { 150832, true }, + { 150781, true }, + { 150794, true }, + { 150805, true }, + { 150827, true }, { 150846, true }, - { 150863, true }, - { 150877, true }, - { 150898, true }, - { 150910, true }, - { 150928, true }, - { 150944, true }, - { 150956, true }, - { 150968, true }, - { 150980, true }, - { 150992, true }, - { 151004, true }, - { 151016, true }, - { 151028, true }, - { 151040, false }, - { 151060, true }, - { 151073, true }, - { 151082, true }, - { 151096, true }, - { 151112, true }, - { 151125, true }, - { 151138, true }, - { 151161, true }, - { 151174, true }, - { 151182, true }, - { 151197, true }, - { 151207, true }, - { 151225, true }, - { 151239, true }, - { 151248, true }, - { 151261, true }, - { 151277, true }, - { 151292, true }, - { 151308, true }, - { 151320, true }, - { 151331, true }, - { 151340, true }, - { 151347, true }, - { 151362, true }, - { 151377, true }, - { 151389, true }, - { 151407, true }, - { 151429, true }, + { 150860, true }, + { 150872, false }, + { 150892, true }, + { 150902, true }, + { 150916, true }, + { 150934, true }, + { 150948, true }, + { 150961, true }, + { 150973, true }, + { 150983, true }, + { 150995, true }, + { 151003, true }, + { 151017, true }, + { 151034, true }, + { 151048, true }, + { 151069, true }, + { 151081, true }, + { 151099, true }, + { 151115, true }, + { 151127, true }, + { 151139, true }, + { 151151, true }, + { 151163, true }, + { 151175, true }, + { 151187, true }, + { 151199, true }, + { 151211, false }, + { 151231, true }, + { 151244, true }, + { 151253, true }, + { 151267, true }, + { 151283, true }, + { 151296, true }, + { 151309, true }, + { 151332, true }, + { 151345, true }, + { 151353, true }, + { 151368, true }, + { 151378, true }, + { 151396, true }, + { 151410, true }, + { 151419, true }, + { 151432, true }, { 151448, true }, - { 151467, true }, - { 151484, true }, - { 151506, true }, - { 151526, true }, - { 151545, true }, - { 151562, true }, - { 151580, true }, - { 151598, true }, - { 151615, true }, - { 151633, true }, + { 151463, true }, + { 151479, true }, + { 151491, true }, + { 151502, true }, + { 151511, true }, + { 151518, true }, + { 151533, true }, + { 151548, true }, + { 151560, true }, + { 151578, true }, + { 151600, true }, + { 151619, true }, + { 151638, true }, { 151655, true }, - { 151669, true }, - { 151686, true }, - { 151702, true }, - { 151719, true }, - { 151736, true }, - { 151757, true }, - { 151772, true }, - { 151794, true }, - { 151818, true }, - { 151835, true }, - { 151846, true }, - { 151859, true }, - { 151872, true }, - { 151884, true }, - { 151894, true }, - { 151909, true }, - { 151920, true }, - { 151932, true }, - { 151952, true }, - { 151961, true }, - { 151970, true }, - { 151995, true }, - { 152007, true }, - { 152025, true }, - { 152041, true }, - { 152052, true }, - { 152068, true }, + { 151677, true }, + { 151697, true }, + { 151716, true }, + { 151733, true }, + { 151751, true }, + { 151769, true }, + { 151786, true }, + { 151804, true }, + { 151826, true }, + { 151840, true }, + { 151857, true }, + { 151873, true }, + { 151890, true }, + { 151907, true }, + { 151928, true }, + { 151943, true }, + { 151965, true }, + { 151989, true }, + { 152006, true }, + { 152017, true }, + { 152030, true }, + { 152043, true }, + { 152055, true }, + { 152065, true }, + { 152080, true }, { 152091, true }, - { 152112, true }, - { 152125, true }, - { 152143, true }, - { 152162, true }, - { 152171, false }, - { 152185, true }, + { 152103, true }, + { 152123, true }, + { 152132, true }, + { 152141, true }, + { 152166, true }, + { 152178, true }, { 152196, true }, - { 152209, true }, + { 152212, true }, { 152223, true }, - { 152238, true }, - { 152249, true }, - { 152265, true }, - { 152278, true }, - { 152287, true }, - { 152301, true }, + { 152239, true }, + { 152262, true }, + { 152283, true }, + { 152296, true }, { 152314, true }, - { 152328, true }, - { 152341, true }, - { 152352, true }, - { 152360, true }, - { 152373, true }, - { 152385, true }, - { 152398, true }, - { 152410, true }, + { 152333, true }, + { 152342, false }, + { 152356, true }, + { 152367, true }, + { 152380, true }, + { 152394, true }, + { 152409, true }, { 152420, true }, - { 152434, true }, - { 152448, true }, - { 152457, true }, + { 152436, true }, + { 152449, true }, + { 152458, true }, { 152472, true }, - { 152483, true }, - { 152496, true }, - { 152509, true }, - { 152520, true }, - { 152533, true }, - { 152547, true }, - { 152565, true }, - { 152578, true }, - { 152590, true }, + { 152485, true }, + { 152499, true }, + { 152512, true }, + { 152523, true }, + { 152531, true }, + { 152544, true }, + { 152556, true }, + { 152569, true }, + { 152581, true }, + { 152591, true }, { 152605, true }, - { 152623, true }, - { 152639, true }, - { 152651, true }, - { 152664, true }, - { 152676, true }, + { 152619, true }, + { 152628, true }, + { 152643, true }, + { 152654, true }, + { 152667, true }, + { 152680, true }, { 152691, true }, - { 152701, true }, - { 152711, true }, - { 152728, true }, - { 152739, true }, - { 152753, true }, - { 152764, true }, + { 152704, true }, + { 152718, true }, + { 152736, true }, + { 152749, true }, + { 152761, true }, { 152776, true }, - { 152803, true }, - { 152817, true }, - { 152825, true }, + { 152794, true }, + { 152810, true }, + { 152822, true }, + { 152835, true }, { 152847, true }, - { 152861, true }, - { 152875, true }, - { 152886, true }, - { 152905, true }, + { 152862, true }, + { 152872, true }, + { 152882, true }, + { 152899, true }, + { 152910, true }, { 152924, true }, - { 152943, true }, - { 152962, true }, - { 152982, true }, - { 153002, true }, - { 153022, true }, - { 153040, true }, - { 153059, true }, - { 153078, true }, - { 153097, true }, - { 153116, true }, - { 153130, true }, - { 153143, true }, - { 153155, true }, - { 153168, false }, - { 153190, true }, - { 153205, true }, - { 153217, true }, - { 153225, true }, - { 153250, true }, - { 153266, true }, - { 153275, true }, - { 153289, true }, - { 153300, true }, - { 153312, true }, - { 153329, true }, - { 153342, true }, - { 153357, true }, - { 153373, true }, - { 153391, true }, - { 153404, true }, - { 153428, true }, - { 153451, true }, - { 153477, true }, - { 153489, true }, - { 153503, true }, - { 153518, true }, - { 153531, true }, - { 153542, true }, - { 153556, true }, - { 153571, true }, - { 153580, true }, - { 153593, true }, - { 153609, true }, - { 153628, true }, - { 153642, true }, - { 153657, true }, - { 153668, true }, - { 153678, true }, - { 153690, true }, - { 153705, true }, - { 153722, true }, - { 153746, true }, - { 153777, true }, - { 153792, true }, - { 153810, true }, - { 153831, true }, - { 153845, true }, - { 153863, true }, - { 153873, true }, - { 153885, true }, - { 153895, true }, - { 153904, true }, + { 152935, true }, + { 152947, true }, + { 152974, true }, + { 152988, true }, + { 152996, true }, + { 153018, true }, + { 153032, true }, + { 153046, true }, + { 153057, true }, + { 153076, true }, + { 153095, true }, + { 153114, true }, + { 153133, true }, + { 153153, true }, + { 153173, true }, + { 153193, true }, + { 153211, true }, + { 153230, true }, + { 153249, true }, + { 153268, true }, + { 153287, true }, + { 153301, true }, + { 153314, true }, + { 153326, true }, + { 153339, false }, + { 153361, true }, + { 153376, true }, + { 153388, true }, + { 153396, true }, + { 153421, true }, + { 153437, true }, + { 153446, true }, + { 153460, true }, + { 153471, true }, + { 153483, true }, + { 153500, true }, + { 153513, true }, + { 153528, true }, + { 153544, true }, + { 153562, true }, + { 153575, true }, + { 153599, true }, + { 153622, true }, + { 153648, true }, + { 153660, true }, + { 153674, true }, + { 153689, true }, + { 153702, true }, + { 153713, true }, + { 153727, true }, + { 153742, true }, + { 153751, true }, + { 153764, true }, + { 153780, true }, + { 153799, true }, + { 153813, true }, + { 153828, true }, + { 153839, true }, + { 153849, true }, + { 153861, true }, + { 153876, true }, + { 153893, true }, { 153917, true }, - { 153932, true }, - { 153945, true }, - { 153957, true }, - { 153965, true }, - { 153983, true }, - { 154014, true }, - { 154025, true }, - { 154040, true }, - { 154057, true }, - { 154072, true }, - { 154085, true }, - { 154101, true }, - { 154121, true }, + { 153948, true }, + { 153963, true }, + { 153981, true }, + { 154002, true }, + { 154016, true }, + { 154034, true }, + { 154044, true }, + { 154056, true }, + { 154066, true }, + { 154075, true }, + { 154088, true }, + { 154103, true }, + { 154116, true }, + { 154128, true }, { 154136, true }, - { 154152, true }, - { 154165, true }, - { 154179, true }, - { 154187, true }, - { 154200, true }, - { 154210, true }, - { 154224, true }, - { 154234, true }, - { 154254, true }, - { 154263, true }, + { 154154, true }, + { 154185, true }, + { 154196, true }, + { 154211, true }, + { 154228, true }, + { 154243, true }, + { 154256, true }, { 154272, true }, - { 154286, true }, - { 154296, true }, + { 154292, true }, { 154307, true }, - { 154316, true }, - { 154324, true }, - { 154337, true }, - { 154356, true }, - { 154366, true }, - { 154375, true }, - { 154391, true }, - { 154402, true }, - { 154415, true }, - { 154422, true }, - { 154431, true }, - { 154447, true }, - { 154458, true }, - { 154465, true }, - { 154488, true }, - { 154497, true }, - { 154517, true }, - { 154525, true }, - { 154535, true }, - { 154556, true }, - { 154568, true }, - { 154577, true }, - { 154585, true }, - { 154594, true }, - { 154605, true }, - { 154616, true }, - { 154626, true }, - { 154637, true }, - { 154644, true }, - { 154654, true }, - { 154663, true }, - { 154671, true }, - { 154682, true }, - { 154694, true }, - { 154702, true }, - { 154712, true }, - { 154728, true }, - { 154740, true }, - { 154770, true }, - { 154790, true }, - { 154804, false }, - { 154822, false }, - { 154838, true }, + { 154323, true }, + { 154336, true }, + { 154350, true }, + { 154358, true }, + { 154371, true }, + { 154381, true }, + { 154395, true }, + { 154405, true }, + { 154425, true }, + { 154434, true }, + { 154443, true }, + { 154457, true }, + { 154467, true }, + { 154478, true }, + { 154487, true }, + { 154495, true }, + { 154508, true }, + { 154527, true }, + { 154537, true }, + { 154546, true }, + { 154562, true }, + { 154573, true }, + { 154586, true }, + { 154593, true }, + { 154602, true }, + { 154618, true }, + { 154629, true }, + { 154636, true }, + { 154659, true }, + { 154668, true }, + { 154688, true }, + { 154696, true }, + { 154706, true }, + { 154727, true }, + { 154739, true }, + { 154748, true }, + { 154756, true }, + { 154765, true }, + { 154776, true }, + { 154787, true }, + { 154797, true }, + { 154808, true }, + { 154815, true }, + { 154825, true }, + { 154834, true }, + { 154842, true }, { 154853, true }, - { 154869, true }, - { 154884, true }, - { 154905, true }, - { 154919, true }, - { 154938, true }, - { 154949, true }, - { 154959, true }, - { 154977, true }, - { 154988, true }, - { 154999, true }, - { 155013, true }, - { 155027, true }, - { 155041, true }, - { 155056, true }, - { 155089, true }, + { 154865, true }, + { 154873, true }, + { 154883, true }, + { 154899, true }, + { 154911, true }, + { 154941, true }, + { 154961, true }, + { 154975, false }, + { 154993, false }, + { 155009, true }, + { 155024, true }, + { 155040, true }, + { 155055, true }, + { 155076, true }, + { 155090, true }, { 155109, true }, - { 155125, true }, - { 155138, true }, - { 155158, false }, - { 155174, true }, - { 155188, true }, - { 155207, true }, - { 155222, true }, - { 155237, true }, - { 155263, true }, - { 155280, true }, - { 155293, true }, - { 155309, true }, - { 155317, true }, - { 155324, true }, - { 155336, true }, - { 155348, true }, - { 155363, true }, - { 155375, true }, - { 155386, true }, - { 155397, true }, - { 155417, true }, - { 155428, false }, - { 155446, true }, - { 155459, true }, - { 155470, true }, - { 155480, true }, + { 155120, true }, + { 155130, true }, + { 155148, true }, + { 155159, true }, + { 155170, true }, + { 155184, true }, + { 155198, true }, + { 155212, true }, + { 155227, true }, + { 155260, true }, + { 155274, true }, + { 155294, true }, + { 155310, true }, + { 155323, true }, + { 155343, false }, + { 155359, true }, + { 155373, true }, + { 155392, true }, + { 155407, true }, + { 155422, true }, + { 155448, true }, + { 155465, true }, + { 155478, true }, { 155494, true }, - { 155506, false }, - { 155522, true }, + { 155502, true }, + { 155509, true }, + { 155521, true }, { 155533, true }, - { 155542, true }, - { 155555, true }, - { 155563, true }, - { 155573, true }, - { 155590, true }, - { 155601, true }, - { 155617, true }, - { 155628, true }, - { 155640, true }, - { 155650, false }, - { 155665, true }, - { 155680, true }, - { 155689, true }, - { 155704, true }, - { 155723, true }, - { 155739, true }, - { 155751, true }, - { 155766, true }, - { 155786, true }, - { 155797, true }, - { 155811, true }, - { 155827, true }, - { 155838, true }, - { 155860, true }, - { 155881, true }, - { 155894, true }, - { 155913, true }, - { 155925, true }, + { 155548, true }, + { 155560, true }, + { 155571, true }, + { 155582, true }, + { 155602, true }, + { 155612, true }, + { 155632, true }, + { 155643, false }, + { 155661, true }, + { 155674, true }, + { 155685, true }, + { 155695, true }, + { 155709, true }, + { 155721, false }, + { 155737, true }, + { 155748, true }, + { 155757, true }, + { 155770, true }, + { 155778, true }, + { 155788, true }, + { 155805, true }, + { 155816, true }, + { 155832, true }, + { 155843, true }, + { 155855, true }, + { 155865, false }, + { 155880, true }, + { 155895, true }, + { 155904, true }, + { 155919, true }, { 155938, true }, - { 155947, true }, - { 155962, true }, - { 155976, true }, - { 155989, true }, - { 156001, true }, + { 155954, true }, + { 155966, true }, + { 155977, true }, + { 155991, true }, + { 156007, true }, { 156018, true }, - { 156042, true }, - { 156063, true }, - { 156076, true }, - { 156094, true }, - { 156115, true }, - { 156132, true }, - { 156144, true }, - { 156161, true }, - { 156178, true }, - { 156190, true }, - { 156208, true }, - { 156221, true }, - { 156228, true }, - { 156240, true }, - { 156250, true }, - { 156264, true }, - { 156277, true }, - { 156290, true }, - { 156304, true }, - { 156317, true }, - { 156334, true }, - { 156349, true }, - { 156363, true }, - { 156375, true }, + { 156040, true }, + { 156061, true }, + { 156074, true }, + { 156093, true }, + { 156105, true }, + { 156118, true }, + { 156127, true }, + { 156142, true }, + { 156156, true }, + { 156169, true }, + { 156181, true }, + { 156198, true }, + { 156222, true }, + { 156243, true }, + { 156256, true }, + { 156274, true }, + { 156295, true }, + { 156312, true }, + { 156324, true }, + { 156341, true }, + { 156358, true }, + { 156370, true }, { 156388, true }, + { 156401, true }, { 156408, true }, - { 156428, true }, - { 156443, true }, - { 156458, true }, - { 156473, true }, - { 156492, true }, - { 156511, true }, - { 156530, true }, - { 156545, true }, - { 156556, true }, - { 156569, false }, - { 156582, true }, - { 156597, true }, - { 156611, true }, - { 156622, true }, - { 156637, true }, + { 156420, true }, + { 156430, true }, + { 156444, true }, + { 156457, true }, + { 156470, true }, + { 156484, true }, + { 156497, true }, + { 156514, true }, + { 156529, true }, + { 156543, true }, + { 156555, true }, + { 156568, true }, + { 156588, true }, + { 156608, true }, + { 156623, true }, + { 156638, true }, { 156653, true }, - { 156666, true }, - { 156679, true }, - { 156699, true }, - { 156708, true }, - { 156724, true }, - { 156737, true }, - { 156753, true }, - { 156766, true }, - { 156783, true }, - { 156798, true }, - { 156812, true }, - { 156822, true }, - { 156835, true }, - { 156848, true }, - { 156866, true }, - { 156874, false }, - { 156887, true }, - { 156905, true }, - { 156928, true }, - { 156957, true }, - { 156975, true }, - { 157006, true }, - { 157036, true }, - { 157058, true }, - { 157074, true }, - { 157085, false }, - { 157098, true }, - { 157110, true }, - { 157125, true }, - { 157142, false }, - { 157161, true }, - { 157180, true }, - { 157191, true }, - { 157201, true }, - { 157211, true }, - { 157226, true }, - { 157240, true }, - { 157251, true }, - { 157261, true }, - { 157271, true }, - { 157283, true }, - { 157299, true }, - { 157310, true }, - { 157327, true }, - { 157340, true }, - { 157353, true }, - { 157363, true }, - { 157374, true }, - { 157384, false }, - { 157399, true }, - { 157414, true }, + { 156672, true }, + { 156691, true }, + { 156710, true }, + { 156725, true }, + { 156736, true }, + { 156749, false }, + { 156762, true }, + { 156777, true }, + { 156791, true }, + { 156802, true }, + { 156817, true }, + { 156833, true }, + { 156846, true }, + { 156859, true }, + { 156879, true }, + { 156888, true }, + { 156904, true }, + { 156917, true }, + { 156933, true }, + { 156946, true }, + { 156963, true }, + { 156978, true }, + { 156992, true }, + { 157002, true }, + { 157015, true }, + { 157028, true }, + { 157046, true }, + { 157054, false }, + { 157067, true }, + { 157085, true }, + { 157108, true }, + { 157137, true }, + { 157155, true }, + { 157186, true }, + { 157216, true }, + { 157238, true }, + { 157254, true }, + { 157265, false }, + { 157278, true }, + { 157290, true }, + { 157305, true }, + { 157322, false }, + { 157341, true }, + { 157360, true }, + { 157371, true }, + { 157381, true }, + { 157391, true }, + { 157406, true }, + { 157420, true }, { 157431, true }, - { 157446, true }, - { 157456, false }, - { 157469, true }, - { 157482, true }, - { 157492, true }, - { 157509, true }, - { 157521, true }, - { 157535, true }, - { 157546, true }, - { 157560, true }, - { 157571, true }, - { 157588, true }, - { 157601, true }, - { 157610, true }, - { 157621, true }, - { 157631, true }, - { 157645, true }, - { 157656, true }, - { 157665, true }, - { 157679, true }, + { 157441, true }, + { 157451, true }, + { 157463, true }, + { 157479, true }, + { 157490, true }, + { 157507, true }, + { 157520, true }, + { 157533, true }, + { 157543, true }, + { 157554, true }, + { 157564, false }, + { 157579, true }, + { 157594, true }, + { 157611, true }, + { 157626, true }, + { 157636, false }, + { 157649, true }, + { 157662, true }, + { 157672, true }, { 157689, true }, - { 157699, true }, + { 157701, true }, { 157715, true }, - { 157723, true }, - { 157734, true }, - { 157746, true }, - { 157756, true }, - { 157765, true }, - { 157778, true }, - { 157789, false }, - { 157797, true }, - { 157815, true }, - { 157822, true }, - { 157833, false }, - { 157853, true }, - { 157860, false }, - { 157876, true }, - { 157892, true }, - { 157908, true }, - { 157923, true }, - { 157935, true }, - { 157955, true }, - { 157969, true }, - { 157981, true }, - { 157997, true }, - { 158007, true }, - { 158020, true }, - { 158038, true }, - { 158052, true }, - { 158069, true }, + { 157726, true }, + { 157740, true }, + { 157751, true }, + { 157768, true }, + { 157781, true }, + { 157790, true }, + { 157801, true }, + { 157811, true }, + { 157825, true }, + { 157836, true }, + { 157845, true }, + { 157859, true }, + { 157869, true }, + { 157879, true }, + { 157895, true }, + { 157903, true }, + { 157914, true }, + { 157926, true }, + { 157936, true }, + { 157945, true }, + { 157958, true }, + { 157969, false }, + { 157977, true }, + { 157995, true }, + { 158002, true }, + { 158013, false }, + { 158033, true }, + { 158040, false }, + { 158056, true }, + { 158072, true }, { 158088, true }, - { 158104, true }, - { 158123, true }, - { 158146, true }, - { 158158, true }, - { 158170, true }, - { 158183, true }, - { 158205, true }, - { 158219, true }, - { 158230, true }, - { 158240, true }, - { 158251, true }, + { 158103, true }, + { 158115, true }, + { 158135, true }, + { 158149, true }, + { 158161, true }, + { 158177, true }, + { 158187, true }, + { 158200, true }, + { 158218, true }, + { 158232, true }, + { 158249, true }, { 158268, true }, - { 158283, true }, - { 158292, true }, - { 158301, true }, - { 158309, true }, + { 158284, true }, + { 158303, true }, { 158326, true }, - { 158340, true }, - { 158356, true }, - { 158378, true }, - { 158394, true }, - { 158408, true }, - { 158416, true }, - { 158433, true }, - { 158450, true }, - { 158464, true }, - { 158483, true }, - { 158499, false }, - { 158513, true }, - { 158526, true }, - { 158543, true }, + { 158338, true }, + { 158350, true }, + { 158363, true }, + { 158385, true }, + { 158399, true }, + { 158410, true }, + { 158420, true }, + { 158431, true }, + { 158448, true }, + { 158463, true }, + { 158472, true }, + { 158481, true }, + { 158489, true }, + { 158506, true }, + { 158520, true }, + { 158536, true }, { 158558, true }, - { 158577, true }, + { 158574, true }, { 158588, true }, - { 158599, true }, + { 158596, true }, { 158613, true }, - { 158627, true }, - { 158642, true }, + { 158630, true }, + { 158644, true }, { 158663, true }, - { 158679, true }, - { 158697, true }, - { 158715, true }, - { 158728, true }, - { 158756, true }, + { 158679, false }, + { 158693, true }, + { 158706, true }, + { 158723, true }, + { 158738, true }, + { 158757, true }, { 158768, true }, - { 158784, true }, - { 158802, true }, - { 158810, true }, - { 158821, true }, - { 158829, true }, + { 158779, true }, + { 158793, true }, + { 158807, true }, + { 158822, true }, { 158843, true }, - { 158857, false }, - { 158866, true }, - { 158873, false }, - { 158883, false }, - { 158903, true }, - { 158914, true }, - { 158921, true }, - { 158931, true }, - { 158942, true }, - { 158952, false }, - { 158971, true }, - { 158985, true }, - { 158997, false }, - { 159010, false }, - { 159022, false }, - { 159043, true }, - { 159065, true }, - { 159078, true }, - { 159096, true }, - { 159112, true }, - { 159130, true }, - { 159139, true }, + { 158859, true }, + { 158877, true }, + { 158895, true }, + { 158908, true }, + { 158936, true }, + { 158948, true }, + { 158964, true }, + { 158982, true }, + { 158990, true }, + { 159001, true }, + { 159009, true }, + { 159023, true }, + { 159037, false }, + { 159046, true }, + { 159053, false }, + { 159063, false }, + { 159083, true }, + { 159094, true }, + { 159101, true }, + { 159111, true }, + { 159122, true }, + { 159132, false }, { 159151, true }, - { 159167, true }, - { 159178, true }, - { 159202, true }, - { 159216, true }, - { 159227, true }, - { 159253, false }, - { 159269, true }, - { 159287, true }, - { 159302, true }, - { 159314, true }, - { 159322, true }, - { 159337, true }, - { 159351, true }, - { 159366, true }, - { 159385, true }, - { 159404, true }, - { 159419, true }, - { 159430, true }, - { 159446, true }, - { 159460, true }, - { 159478, true }, - { 159488, false }, - { 159517, true }, - { 159531, true }, - { 159555, true }, - { 159574, true }, - { 159587, true }, - { 159600, true }, - { 159615, true }, - { 159629, true }, - { 159642, true }, - { 159662, true }, - { 159677, true }, - { 159695, true }, - { 159705, false }, - { 159720, true }, - { 159728, true }, - { 159741, false }, - { 159755, true }, - { 159766, true }, - { 159774, true }, - { 159782, true }, - { 159796, true }, - { 159818, true }, - { 159830, true }, - { 159842, true }, - { 159854, true }, - { 159869, true }, - { 159889, true }, - { 159912, true }, - { 159931, true }, - { 159950, true }, - { 159969, true }, - { 159988, true }, - { 160007, true }, - { 160026, true }, - { 160045, true }, - { 160062, true }, - { 160080, true }, - { 160097, true }, - { 160115, true }, + { 159165, false }, + { 159178, false }, + { 159190, false }, + { 159211, true }, + { 159233, true }, + { 159246, true }, + { 159264, true }, + { 159280, true }, + { 159298, true }, + { 159307, true }, + { 159319, true }, + { 159335, true }, + { 159346, true }, + { 159370, true }, + { 159384, true }, + { 159395, false }, + { 159411, true }, + { 159429, true }, + { 159444, true }, + { 159456, true }, + { 159464, true }, + { 159479, true }, + { 159493, true }, + { 159508, true }, + { 159527, true }, + { 159546, true }, + { 159561, true }, + { 159572, true }, + { 159588, true }, + { 159602, true }, + { 159620, true }, + { 159630, false }, + { 159659, true }, + { 159673, true }, + { 159697, true }, + { 159716, true }, + { 159729, true }, + { 159742, true }, + { 159757, true }, + { 159771, true }, + { 159784, true }, + { 159804, true }, + { 159819, true }, + { 159837, true }, + { 159847, false }, + { 159862, true }, + { 159870, true }, + { 159883, false }, + { 159897, true }, + { 159908, true }, + { 159916, true }, + { 159924, true }, + { 159938, true }, + { 159960, true }, + { 159972, true }, + { 159984, true }, + { 159996, true }, + { 160011, true }, + { 160031, true }, + { 160054, true }, + { 160073, true }, + { 160092, true }, + { 160111, true }, { 160130, true }, - { 160143, false }, - { 160157, true }, - { 160181, true }, - { 160198, true }, - { 160216, true }, - { 160232, true }, - { 160250, true }, - { 160267, true }, - { 160283, true }, - { 160296, true }, - { 160309, true }, - { 160322, true }, - { 160339, true }, - { 160360, true }, - { 160378, true }, - { 160393, true }, - { 160410, true }, - { 160429, true }, - { 160446, true }, - { 160458, true }, - { 160469, true }, - { 160477, true }, - { 160490, true }, - { 160504, true }, - { 160520, true }, - { 160536, true }, + { 160149, true }, + { 160168, true }, + { 160187, true }, + { 160204, true }, + { 160222, true }, + { 160239, true }, + { 160254, true }, + { 160272, true }, + { 160287, true }, + { 160300, false }, + { 160314, true }, + { 160338, true }, + { 160355, true }, + { 160373, true }, + { 160389, true }, + { 160407, true }, + { 160424, true }, + { 160440, true }, + { 160453, true }, + { 160466, true }, + { 160479, true }, + { 160496, true }, + { 160517, true }, + { 160535, true }, { 160550, true }, - { 160563, true }, - { 160576, true }, - { 160589, true }, - { 160599, true }, - { 160612, true }, - { 160623, true }, - { 160643, true }, - { 160663, true }, - { 160678, true }, + { 160567, true }, + { 160586, true }, + { 160603, true }, + { 160615, true }, + { 160626, true }, + { 160634, true }, + { 160647, true }, + { 160661, true }, { 160688, true }, - { 160699, false }, - { 160714, true }, - { 160729, false }, - { 160739, false }, - { 160749, false }, - { 160759, true }, - { 160775, true }, - { 160787, true }, - { 160795, false }, - { 160804, false }, - { 160815, true }, - { 160823, true }, - { 160832, true }, - { 160845, true }, - { 160865, true }, - { 160886, true }, - { 160902, true }, - { 160919, true }, - { 160938, true }, - { 160955, true }, - { 160969, true }, - { 160979, true }, - { 160990, true }, + { 160704, true }, + { 160720, true }, + { 160734, true }, + { 160747, true }, + { 160760, true }, + { 160773, true }, + { 160783, true }, + { 160796, true }, + { 160807, true }, + { 160827, true }, + { 160847, true }, + { 160862, true }, + { 160872, true }, + { 160883, false }, + { 160898, true }, + { 160913, false }, + { 160923, false }, + { 160933, false }, + { 160943, true }, + { 160959, true }, + { 160971, true }, + { 160979, false }, + { 160988, false }, { 160999, true }, - { 161008, true }, - { 161021, true }, - { 161043, true }, - { 161072, true }, - { 161091, true }, - { 161108, true }, - { 161131, true }, - { 161139, true }, - { 161157, true }, - { 161175, true }, - { 161186, true }, - { 161197, false }, - { 161208, true }, - { 161217, true }, - { 161230, true }, - { 161241, true }, - { 161254, true }, - { 161267, true }, - { 161284, true }, - { 161297, true }, - { 161308, true }, - { 161318, true }, - { 161327, true }, - { 161337, true }, - { 161347, true }, - { 161360, true }, - { 161371, true }, + { 161007, true }, + { 161020, true }, + { 161040, true }, + { 161061, true }, + { 161077, true }, + { 161094, true }, + { 161113, true }, + { 161130, true }, + { 161144, true }, + { 161154, true }, + { 161165, true }, + { 161174, true }, + { 161183, true }, + { 161196, true }, + { 161218, true }, + { 161247, true }, + { 161266, true }, + { 161283, true }, + { 161306, true }, + { 161314, true }, + { 161332, true }, + { 161350, true }, + { 161361, true }, + { 161372, false }, + { 161383, true }, { 161392, true }, - { 161402, true }, - { 161415, true }, - { 161425, true }, - { 161438, true }, - { 161457, true }, - { 161468, true }, + { 161405, true }, + { 161416, true }, + { 161429, true }, + { 161442, true }, + { 161459, true }, + { 161472, true }, { 161483, true }, - { 161497, true }, - { 161508, true }, - { 161520, true }, - { 161532, true }, - { 161540, true }, - { 161554, true }, - { 161569, true }, - { 161591, true }, - { 161606, false }, - { 161620, true }, - { 161643, false }, - { 161655, false }, - { 161670, true }, - { 161684, true }, - { 161693, true }, - { 161708, true }, + { 161493, true }, + { 161502, true }, + { 161512, true }, + { 161522, true }, + { 161535, true }, + { 161546, true }, + { 161567, true }, + { 161577, true }, + { 161590, true }, + { 161600, true }, + { 161613, true }, + { 161632, true }, + { 161643, true }, + { 161658, true }, + { 161672, true }, + { 161683, true }, + { 161695, true }, + { 161707, true }, + { 161715, true }, { 161729, true }, { 161744, true }, - { 161756, true }, - { 161767, true }, - { 161780, true }, - { 161790, true }, - { 161811, true }, - { 161829, true }, - { 161850, true }, - { 161876, true }, - { 161899, true }, - { 161932, true }, - { 161951, true }, - { 161975, true }, - { 162003, true }, - { 162017, false }, - { 162027, true }, - { 162038, true }, - { 162052, true }, - { 162063, true }, - { 162074, false }, - { 162098, true }, - { 162109, true }, - { 162121, true }, - { 162135, true }, - { 162146, true }, - { 162156, true }, - { 162164, true }, - { 162171, true }, - { 162182, true }, - { 162192, true }, - { 162203, true }, - { 162214, true }, - { 162224, true }, - { 162235, true }, - { 162244, true }, - { 162259, true }, - { 162274, true }, - { 162287, true }, - { 162298, true }, - { 162307, true }, - { 162318, true }, - { 162329, true }, - { 162343, true }, - { 162352, true }, - { 162368, true }, - { 162376, true }, - { 162388, true }, - { 162400, true }, - { 162416, true }, - { 162424, true }, + { 161766, true }, + { 161781, false }, + { 161795, true }, + { 161818, false }, + { 161830, false }, + { 161845, true }, + { 161859, true }, + { 161868, true }, + { 161883, true }, + { 161904, true }, + { 161919, true }, + { 161931, true }, + { 161942, true }, + { 161955, true }, + { 161965, true }, + { 161986, true }, + { 162004, true }, + { 162025, true }, + { 162051, true }, + { 162074, true }, + { 162107, true }, + { 162126, true }, + { 162150, true }, + { 162178, true }, + { 162192, false }, + { 162202, true }, + { 162213, true }, + { 162227, true }, + { 162238, true }, + { 162249, false }, + { 162273, true }, + { 162284, true }, + { 162296, true }, + { 162310, true }, + { 162321, true }, + { 162331, true }, + { 162339, true }, + { 162346, true }, + { 162357, true }, + { 162367, true }, + { 162378, true }, + { 162389, true }, + { 162399, true }, + { 162410, true }, + { 162419, true }, { 162434, true }, - { 162453, true }, - { 162461, true }, - { 162474, true }, - { 162491, true }, - { 162502, true }, - { 162514, true }, - { 162523, true }, - { 162532, true }, - { 162553, true }, - { 162572, true }, - { 162602, true }, - { 162632, true }, - { 162648, true }, - { 162663, true }, - { 162676, true }, + { 162449, true }, + { 162462, true }, + { 162473, true }, + { 162482, true }, + { 162493, true }, + { 162504, true }, + { 162518, true }, + { 162527, true }, + { 162543, true }, + { 162551, true }, + { 162563, true }, + { 162575, true }, + { 162591, true }, + { 162599, true }, + { 162609, true }, + { 162628, true }, + { 162636, true }, + { 162649, true }, + { 162666, true }, + { 162677, true }, { 162689, true }, - { 162706, true }, - { 162719, true }, - { 162735, true }, - { 162743, true }, - { 162751, true }, - { 162765, true }, - { 162784, false }, - { 162793, true }, - { 162815, true }, - { 162837, true }, + { 162698, true }, + { 162707, true }, + { 162728, true }, + { 162747, true }, + { 162777, true }, + { 162807, true }, + { 162823, true }, + { 162838, true }, { 162851, true }, - { 162866, true }, - { 162879, true }, - { 162893, true }, - { 162907, true }, - { 162915, true }, - { 162927, true }, - { 162938, true }, - { 162950, true }, + { 162864, true }, + { 162881, true }, + { 162894, true }, + { 162910, true }, + { 162918, true }, + { 162926, true }, + { 162940, true }, + { 162959, false }, { 162968, true }, - { 162981, true }, - { 162994, true }, - { 163006, true }, - { 163016, true }, + { 162990, true }, + { 163012, true }, { 163026, true }, - { 163035, true }, - { 163046, true }, - { 163057, false }, - { 163067, false }, - { 163083, true }, - { 163093, true }, - { 163107, true }, - { 163119, true }, - { 163132, true }, - { 163142, true }, + { 163041, true }, + { 163054, true }, + { 163068, true }, + { 163082, true }, + { 163090, true }, + { 163102, true }, + { 163113, true }, + { 163125, true }, + { 163143, true }, { 163156, true }, - { 163171, true }, - { 163183, true }, - { 163194, true }, - { 163203, true }, - { 163216, true }, - { 163226, true }, - { 163237, true }, - { 163260, false }, - { 163274, true }, - { 163286, true }, - { 163299, true }, - { 163308, true }, - { 163321, false }, + { 163169, true }, + { 163181, true }, + { 163191, true }, + { 163201, true }, + { 163210, true }, + { 163221, true }, + { 163232, false }, + { 163242, false }, + { 163258, true }, + { 163268, true }, + { 163282, true }, + { 163294, true }, + { 163307, true }, + { 163317, true }, { 163331, true }, - { 163343, true }, - { 163354, true }, - { 163368, true }, - { 163382, true }, - { 163392, true }, + { 163346, true }, + { 163358, true }, + { 163369, true }, + { 163378, true }, + { 163391, true }, { 163401, true }, - { 163411, true }, - { 163422, true }, - { 163437, true }, + { 163412, true }, + { 163435, false }, { 163449, true }, { 163461, true }, - { 163473, true }, - { 163487, true }, - { 163504, true }, - { 163514, true }, - { 163524, false }, - { 163533, false }, - { 163552, true }, - { 163567, true }, - { 163583, true }, - { 163598, false }, - { 163608, true }, - { 163620, true }, - { 163632, false }, - { 163644, true }, - { 163657, true }, - { 163675, true }, - { 163690, true }, - { 163705, true }, - { 163727, false }, - { 163743, true }, - { 163755, true }, - { 163768, true }, - { 163780, true }, - { 163791, true }, - { 163804, false }, - { 163819, true }, - { 163834, true }, - { 163844, true }, - { 163854, true }, - { 163868, true }, - { 163882, true }, - { 163905, true }, - { 163917, true }, - { 163928, true }, - { 163944, true }, - { 163955, true }, - { 163966, true }, + { 163474, true }, + { 163483, true }, + { 163496, true }, + { 163508, true }, + { 163519, true }, + { 163533, true }, + { 163547, true }, + { 163557, true }, + { 163566, true }, + { 163576, true }, + { 163587, true }, + { 163602, true }, + { 163614, true }, + { 163626, true }, + { 163638, true }, + { 163652, true }, + { 163669, true }, + { 163679, true }, + { 163689, false }, + { 163698, false }, + { 163717, true }, + { 163732, true }, + { 163748, true }, + { 163763, false }, + { 163773, true }, + { 163785, true }, + { 163797, false }, + { 163809, true }, + { 163822, true }, + { 163840, true }, + { 163855, true }, + { 163870, true }, + { 163892, false }, + { 163908, true }, + { 163920, true }, + { 163933, true }, + { 163945, true }, + { 163956, true }, + { 163969, false }, { 163984, true }, - { 164002, true }, - { 164015, true }, - { 164036, false }, - { 164055, true }, - { 164075, true }, - { 164097, true }, - { 164121, true }, - { 164133, true }, - { 164148, true }, - { 164166, true }, - { 164178, true }, - { 164194, true }, - { 164209, true }, - { 164225, true }, - { 164241, true }, - { 164258, true }, - { 164274, true }, - { 164291, true }, + { 163999, true }, + { 164009, true }, + { 164019, true }, + { 164033, true }, + { 164047, true }, + { 164070, true }, + { 164082, true }, + { 164093, true }, + { 164109, true }, + { 164120, true }, + { 164131, true }, + { 164149, true }, + { 164167, true }, + { 164180, true }, + { 164201, false }, + { 164220, true }, + { 164240, true }, + { 164262, true }, + { 164286, true }, + { 164298, true }, { 164313, true }, - { 164335, true }, - { 164346, true }, - { 164362, true }, - { 164373, true }, - { 164393, true }, - { 164404, true }, - { 164419, true }, - { 164435, true }, - { 164450, true }, - { 164465, true }, - { 164479, true }, - { 164502, true }, - { 164517, true }, - { 164531, true }, - { 164546, true }, - { 164563, true }, - { 164580, true }, - { 164592, true }, - { 164617, true }, - { 164629, true }, + { 164331, true }, + { 164343, true }, + { 164359, true }, + { 164374, true }, + { 164390, true }, + { 164406, true }, + { 164423, true }, + { 164439, true }, + { 164456, true }, + { 164478, true }, + { 164500, true }, + { 164511, true }, + { 164527, true }, + { 164538, true }, + { 164558, true }, + { 164569, true }, + { 164584, true }, + { 164600, true }, + { 164615, true }, + { 164630, true }, { 164644, true }, - { 164660, true }, - { 164675, true }, - { 164704, true }, - { 164726, true }, - { 164744, true }, - { 164758, true }, - { 164771, true }, - { 164786, true }, - { 164801, true }, - { 164808, true }, - { 164824, true }, - { 164835, true }, - { 164847, true }, - { 164858, true }, - { 164868, true }, - { 164879, true }, - { 164893, true }, - { 164907, true }, - { 164919, true }, - { 164931, true }, - { 164942, true }, - { 164957, true }, - { 164971, true }, - { 164982, true }, - { 164995, true }, - { 165024, true }, - { 165040, true }, - { 165059, true }, - { 165068, true }, - { 165083, true }, - { 165090, true }, - { 165100, true }, - { 165110, true }, - { 165119, true }, - { 165135, true }, - { 165150, true }, - { 165159, true }, - { 165171, true }, - { 165179, true }, - { 165188, true }, - { 165200, true }, - { 165216, true }, - { 165235, true }, - { 165247, false }, - { 165264, false }, + { 164667, true }, + { 164682, true }, + { 164696, true }, + { 164711, true }, + { 164728, true }, + { 164745, true }, + { 164757, true }, + { 164782, true }, + { 164794, true }, + { 164809, true }, + { 164825, true }, + { 164840, true }, + { 164869, true }, + { 164891, true }, + { 164909, true }, + { 164923, true }, + { 164936, true }, + { 164951, true }, + { 164966, true }, + { 164973, true }, + { 164989, true }, + { 165000, true }, + { 165012, true }, + { 165023, true }, + { 165033, true }, + { 165044, true }, + { 165058, true }, + { 165072, true }, + { 165084, true }, + { 165096, true }, + { 165107, true }, + { 165122, true }, + { 165136, true }, + { 165147, true }, + { 165160, true }, + { 165189, true }, + { 165205, true }, + { 165224, true }, + { 165233, true }, + { 165248, true }, + { 165255, true }, + { 165265, true }, + { 165275, true }, { 165284, true }, - { 165299, true }, + { 165300, true }, { 165315, true }, - { 165328, true }, - { 165346, true }, - { 165361, true }, - { 165370, true }, - { 165385, true }, - { 165399, true }, - { 165415, true }, - { 165430, true }, - { 165452, true }, - { 165473, true }, - { 165492, true }, + { 165324, true }, + { 165336, true }, + { 165344, true }, + { 165353, true }, + { 165365, true }, + { 165381, true }, + { 165400, true }, + { 165412, false }, + { 165429, false }, + { 165449, true }, + { 165464, true }, + { 165480, true }, + { 165493, true }, { 165511, true }, - { 165527, true }, - { 165546, true }, - { 165557, true }, - { 165566, true }, - { 165578, true }, - { 165588, true }, - { 165603, true }, + { 165526, true }, + { 165535, true }, + { 165550, true }, + { 165564, true }, + { 165580, true }, + { 165595, true }, { 165617, true }, - { 165630, true }, { 165638, true }, - { 165646, true }, - { 165655, true }, - { 165667, true }, - { 165679, true }, - { 165688, true }, - { 165700, true }, - { 165708, true }, - { 165720, true }, - { 165746, true }, - { 165769, false }, - { 165785, true }, - { 165799, true }, - { 165819, true }, - { 165830, true }, - { 165851, true }, - { 165870, true }, - { 165884, true }, - { 165899, true }, - { 165913, true }, - { 165930, true }, - { 165944, true }, - { 165964, false }, - { 165979, true }, - { 165987, true }, - { 166002, true }, - { 166017, true }, - { 166031, true }, - { 166042, true }, - { 166059, true }, - { 166077, true }, - { 166097, true }, - { 166121, true }, - { 166128, true }, - { 166139, true }, - { 166150, true }, - { 166163, true }, - { 166175, false }, - { 166190, true }, - { 166206, true }, - { 166219, true }, - { 166227, true }, - { 166237, true }, - { 166250, true }, - { 166265, false }, - { 166274, true }, - { 166288, true }, - { 166303, true }, - { 166313, true }, - { 166325, true }, - { 166335, true }, - { 166348, true }, - { 166361, true }, - { 166373, true }, - { 166381, true }, - { 166391, true }, - { 166405, true }, - { 166426, true }, + { 165657, true }, + { 165676, true }, + { 165692, true }, + { 165711, true }, + { 165722, true }, + { 165731, true }, + { 165743, true }, + { 165753, true }, + { 165768, true }, + { 165782, true }, + { 165795, true }, + { 165803, true }, + { 165811, true }, + { 165820, true }, + { 165832, true }, + { 165844, true }, + { 165853, true }, + { 165865, true }, + { 165873, true }, + { 165885, true }, + { 165911, true }, + { 165934, false }, + { 165950, true }, + { 165964, true }, + { 165984, true }, + { 165995, true }, + { 166016, true }, + { 166035, true }, + { 166049, true }, + { 166064, true }, + { 166078, true }, + { 166095, true }, + { 166109, true }, + { 166129, false }, + { 166144, true }, + { 166152, true }, + { 166167, true }, + { 166182, true }, + { 166196, true }, + { 166207, true }, + { 166224, true }, + { 166242, true }, + { 166262, true }, + { 166286, true }, + { 166293, true }, + { 166304, true }, + { 166315, true }, + { 166328, true }, + { 166340, false }, + { 166355, true }, + { 166371, true }, + { 166384, true }, + { 166392, true }, + { 166402, true }, + { 166415, true }, + { 166430, false }, { 166439, true }, - { 166449, false }, - { 166469, true }, - { 166480, true }, - { 166488, true }, - { 166495, true }, - { 166505, true }, - { 166517, true }, - { 166523, true }, - { 166533, true }, - { 166541, false }, - { 166561, true }, - { 166576, true }, - { 166603, true }, - { 166612, true }, - { 166621, true }, - { 166629, true }, - { 166643, true }, - { 166658, true }, + { 166453, true }, + { 166468, true }, + { 166478, true }, + { 166490, true }, + { 166500, true }, + { 166513, true }, + { 166526, true }, + { 166538, true }, + { 166546, true }, + { 166556, true }, + { 166570, true }, + { 166591, true }, + { 166604, true }, + { 166614, false }, + { 166634, true }, + { 166645, true }, + { 166653, true }, + { 166660, true }, { 166670, true }, - { 166683, true }, - { 166701, true }, - { 166712, true }, - { 166723, true }, - { 166731, true }, + { 166682, true }, + { 166688, true }, + { 166698, true }, + { 166706, false }, + { 166726, true }, { 166741, true }, - { 166749, true }, - { 166761, true }, - { 166770, true }, - { 166780, true }, - { 166793, true }, - { 166803, true }, - { 166815, true }, - { 166830, true }, - { 166842, true }, - { 166856, true }, - { 166872, true }, - { 166890, true }, - { 166903, true }, - { 166916, true }, - { 166933, true }, - { 166948, true }, - { 166967, true }, - { 166982, true }, - { 166990, true }, - { 167002, true }, - { 167016, true }, - { 167036, true }, - { 167048, true }, - { 167074, true }, - { 167096, true }, - { 167114, true }, - { 167131, true }, - { 167148, true }, - { 167159, true }, - { 167177, true }, - { 167189, true }, - { 167202, true }, - { 167218, true }, - { 167249, true }, - { 167263, true }, - { 167280, true }, - { 167298, true }, - { 167317, true }, - { 167333, true }, - { 167356, true }, - { 167375, true }, - { 167389, true }, - { 167405, true }, - { 167433, true }, - { 167449, true }, - { 167466, true }, - { 167497, true }, - { 167527, false }, - { 167543, true }, + { 166768, true }, + { 166777, true }, + { 166786, true }, + { 166794, true }, + { 166808, true }, + { 166823, true }, + { 166835, true }, + { 166848, true }, + { 166866, true }, + { 166877, true }, + { 166888, true }, + { 166896, true }, + { 166906, true }, + { 166914, true }, + { 166926, true }, + { 166935, true }, + { 166945, true }, + { 166958, true }, + { 166968, true }, + { 166980, true }, + { 166995, true }, + { 167007, true }, + { 167021, true }, + { 167037, true }, + { 167055, true }, + { 167068, true }, + { 167081, true }, + { 167098, true }, + { 167113, true }, + { 167132, true }, + { 167147, true }, + { 167155, true }, + { 167167, true }, + { 167181, true }, + { 167201, true }, + { 167213, true }, + { 167239, true }, + { 167261, true }, + { 167279, true }, + { 167296, true }, + { 167313, true }, + { 167324, true }, + { 167342, true }, + { 167354, true }, + { 167367, true }, + { 167383, true }, + { 167414, true }, + { 167428, true }, + { 167445, true }, + { 167463, true }, + { 167482, true }, + { 167498, true }, + { 167521, true }, + { 167540, true }, { 167554, true }, - { 167566, true }, - { 167579, true }, - { 167596, true }, - { 167610, true }, - { 167635, true }, - { 167654, true }, - { 167669, true }, - { 167680, true }, - { 167700, true }, - { 167715, true }, - { 167726, true }, - { 167741, true }, - { 167759, true }, + { 167570, true }, + { 167598, true }, + { 167614, true }, + { 167631, true }, + { 167662, true }, + { 167692, false }, + { 167708, true }, + { 167719, true }, + { 167731, true }, + { 167744, true }, + { 167761, true }, { 167775, true }, - { 167787, true }, - { 167797, true }, - { 167814, true }, - { 167826, false }, - { 167840, true }, - { 167847, false }, - { 167879, true }, - { 167892, true }, - { 167911, true }, - { 167925, true }, - { 167935, true }, - { 167949, true }, + { 167800, true }, + { 167819, true }, + { 167834, true }, + { 167845, true }, + { 167865, true }, + { 167880, true }, + { 167891, true }, + { 167906, true }, + { 167924, true }, + { 167940, true }, + { 167952, true }, { 167962, true }, { 167979, true }, - { 167993, true }, - { 168009, false }, - { 168024, true }, - { 168038, true }, - { 168049, true }, - { 168060, true }, - { 168072, true }, - { 168081, true }, - { 168088, true }, - { 168099, true }, - { 168107, true }, + { 167991, false }, + { 168005, true }, + { 168012, false }, + { 168044, true }, + { 168057, true }, + { 168076, true }, + { 168090, true }, + { 168100, true }, { 168114, true }, - { 168125, true }, - { 168133, true }, - { 168141, true }, - { 168149, true }, - { 168162, true }, - { 168177, true }, - { 168187, true }, - { 168197, true }, - { 168204, true }, - { 168216, true }, - { 168230, true }, - { 168239, true }, - { 168258, true }, - { 168267, true }, - { 168283, true }, - { 168295, true }, - { 168307, true }, - { 168319, true }, - { 168330, true }, + { 168127, true }, + { 168144, true }, + { 168158, true }, + { 168174, false }, + { 168189, true }, + { 168203, true }, + { 168214, true }, + { 168225, true }, + { 168237, true }, + { 168246, true }, + { 168253, true }, + { 168264, true }, + { 168272, true }, + { 168279, true }, + { 168290, true }, + { 168298, true }, + { 168306, true }, + { 168314, true }, + { 168327, true }, { 168342, true }, - { 168353, true }, - { 168364, true }, - { 168379, true }, - { 168387, true }, - { 168412, true }, + { 168352, true }, + { 168362, true }, + { 168369, true }, + { 168381, true }, + { 168395, true }, + { 168404, true }, { 168423, true }, - { 168434, true }, - { 168445, true }, - { 168459, true }, - { 168475, true }, - { 168487, true }, - { 168501, true }, - { 168515, true }, - { 168530, true }, - { 168551, true }, - { 168566, true }, - { 168587, true }, - { 168595, true }, - { 168609, true }, - { 168616, true }, - { 168628, true }, + { 168432, true }, + { 168448, true }, + { 168460, true }, + { 168472, true }, + { 168484, true }, + { 168495, true }, + { 168507, true }, + { 168518, true }, + { 168529, true }, + { 168544, true }, + { 168552, true }, + { 168577, true }, + { 168588, true }, + { 168599, true }, + { 168610, true }, + { 168624, true }, { 168640, true }, - { 168654, true }, - { 168671, true }, - { 168684, true }, - { 168700, false }, - { 168713, true }, - { 168726, true }, - { 168740, true }, - { 168751, true }, + { 168652, true }, + { 168666, true }, + { 168680, true }, + { 168695, true }, + { 168716, true }, + { 168731, true }, + { 168752, true }, { 168760, true }, - { 168770, true }, - { 168777, true }, - { 168789, true }, - { 168798, true }, - { 168807, true }, - { 168815, true }, - { 168830, true }, - { 168838, true }, - { 168850, true }, - { 168862, true }, - { 168872, true }, - { 168882, true }, - { 168893, true }, - { 168902, true }, - { 168920, true }, - { 168938, true }, - { 168948, true }, - { 168959, false }, - { 168970, true }, - { 168992, true }, - { 169000, true }, - { 169008, false }, - { 169016, true }, - { 169024, true }, - { 169040, true }, - { 169056, true }, - { 169069, true }, - { 169080, true }, - { 169092, true }, - { 169111, true }, - { 169137, true }, - { 169151, true }, + { 168774, true }, + { 168781, true }, + { 168793, true }, + { 168805, true }, + { 168819, true }, + { 168836, true }, + { 168849, true }, + { 168865, false }, + { 168878, true }, + { 168891, true }, + { 168905, true }, + { 168916, true }, + { 168925, true }, + { 168935, true }, + { 168942, true }, + { 168954, true }, + { 168963, true }, + { 168972, true }, + { 168980, true }, + { 168995, true }, + { 169003, true }, + { 169015, true }, + { 169027, true }, + { 169037, true }, + { 169047, true }, + { 169058, true }, + { 169067, true }, + { 169085, true }, + { 169103, true }, + { 169113, true }, + { 169124, false }, + { 169135, true }, + { 169157, true }, { 169165, true }, - { 169179, true }, - { 169194, true }, - { 169206, true }, - { 169219, true }, - { 169231, true }, - { 169241, false }, - { 169259, true }, - { 169275, true }, - { 169290, true }, - { 169301, true }, - { 169318, true }, + { 169173, false }, + { 169181, true }, + { 169189, true }, + { 169205, true }, + { 169221, true }, + { 169234, true }, + { 169245, true }, + { 169257, true }, + { 169276, true }, + { 169302, true }, + { 169316, true }, { 169330, true }, - { 169341, true }, - { 169360, true }, - { 169376, true }, - { 169388, true }, - { 169400, true }, - { 169413, true }, - { 169425, true }, - { 169442, true }, - { 169449, true }, - { 169462, true }, - { 169479, true }, - { 169501, true }, - { 169512, true }, - { 169522, true }, - { 169532, true }, - { 169544, false }, - { 169555, true }, - { 169569, true }, + { 169344, true }, + { 169359, true }, + { 169371, true }, + { 169384, true }, + { 169396, true }, + { 169406, false }, + { 169424, true }, + { 169440, true }, + { 169455, true }, + { 169466, true }, + { 169483, true }, + { 169495, true }, + { 169506, true }, + { 169525, true }, + { 169541, true }, + { 169553, true }, + { 169565, true }, { 169578, true }, - { 169589, true }, + { 169590, true }, { 169607, true }, - { 169626, true }, - { 169642, true }, - { 169655, true }, - { 169671, true }, - { 169698, true }, - { 169710, true }, + { 169614, true }, + { 169627, true }, + { 169644, true }, + { 169666, true }, + { 169677, true }, + { 169687, true }, + { 169697, true }, + { 169709, false }, { 169720, true }, - { 169735, true }, + { 169734, true }, { 169743, true }, - { 169760, true }, - { 169789, true }, - { 169803, true }, - { 169813, true }, - { 169849, true }, - { 169882, true }, - { 169905, true }, - { 169918, true }, - { 169930, true }, - { 169942, true }, - { 169951, true }, - { 169964, false }, - { 169987, true }, - { 170003, true }, - { 170021, true }, - { 170038, true }, - { 170062, true }, - { 170074, true }, + { 169754, true }, + { 169772, true }, + { 169791, true }, + { 169807, true }, + { 169820, true }, + { 169836, true }, + { 169863, true }, + { 169875, true }, + { 169885, true }, + { 169900, true }, + { 169908, true }, + { 169925, true }, + { 169954, true }, + { 169968, true }, + { 169978, true }, + { 170014, true }, + { 170047, true }, + { 170070, true }, { 170083, true }, - { 170092, true }, - { 170101, true }, - { 170113, true }, - { 170122, true }, - { 170130, true }, - { 170143, true }, - { 170154, true }, - { 170179, true }, - { 170190, true }, + { 170095, true }, + { 170107, true }, + { 170116, true }, + { 170129, false }, + { 170152, true }, + { 170168, true }, + { 170186, true }, { 170203, true }, - { 170216, true }, - { 170229, true }, - { 170243, true }, - { 170256, true }, - { 170267, false }, + { 170227, true }, + { 170239, true }, + { 170248, true }, + { 170257, true }, + { 170266, true }, { 170278, true }, - { 170286, true }, - { 170294, true }, - { 170309, true }, - { 170317, true }, - { 170325, true }, - { 170337, true }, - { 170345, true }, - { 170358, false }, - { 170369, true }, - { 170384, true }, - { 170404, true }, - { 170412, true }, - { 170430, true }, - { 170440, true }, - { 170460, true }, - { 170480, false }, - { 170493, true }, - { 170504, true }, - { 170525, true }, - { 170548, true }, - { 170563, true }, - { 170589, true }, - { 170599, true }, - { 170612, true }, - { 170628, true }, - { 170643, false }, - { 170661, true }, - { 170692, true }, - { 170712, true }, - { 170729, true }, - { 170746, true }, + { 170287, true }, + { 170295, true }, + { 170308, true }, + { 170319, true }, + { 170344, true }, + { 170355, true }, + { 170368, true }, + { 170381, true }, + { 170394, true }, + { 170408, true }, + { 170421, true }, + { 170432, false }, + { 170443, true }, + { 170451, true }, + { 170459, true }, + { 170474, true }, + { 170482, true }, + { 170490, true }, + { 170502, true }, + { 170510, true }, + { 170523, false }, + { 170534, true }, + { 170549, true }, + { 170569, true }, + { 170577, true }, + { 170595, true }, + { 170605, true }, + { 170625, true }, + { 170645, false }, + { 170658, true }, + { 170669, true }, + { 170690, true }, + { 170713, true }, + { 170728, true }, + { 170754, true }, { 170764, true }, { 170777, true }, - { 170792, true }, - { 170804, true }, - { 170814, true }, - { 170821, true }, - { 170841, true }, - { 170854, true }, - { 170871, true }, - { 170883, true }, - { 170897, true }, - { 170909, true }, - { 170924, true }, + { 170793, true }, + { 170808, false }, + { 170826, true }, + { 170857, true }, + { 170877, true }, + { 170894, true }, + { 170911, true }, + { 170929, true }, { 170942, true }, - { 170955, true }, - { 170968, true }, + { 170957, true }, + { 170969, true }, { 170979, true }, - { 170990, true }, - { 171007, true }, - { 171018, true }, - { 171033, true }, - { 171044, true }, - { 171056, true }, - { 171068, false }, - { 171080, true }, - { 171094, true }, - { 171111, true }, - { 171121, true }, - { 171134, false }, - { 171152, false }, - { 171163, true }, - { 171180, true }, - { 171197, true }, - { 171214, true }, - { 171225, true }, - { 171235, true }, - { 171250, true }, - { 171260, true }, - { 171275, true }, - { 171292, true }, - { 171303, true }, - { 171321, true }, - { 171332, true }, - { 171347, true }, + { 170986, true }, + { 171006, true }, + { 171019, true }, + { 171036, true }, + { 171048, true }, + { 171062, true }, + { 171074, true }, + { 171089, true }, + { 171107, true }, + { 171120, true }, + { 171133, true }, + { 171144, true }, + { 171155, true }, + { 171172, true }, + { 171183, true }, + { 171198, true }, + { 171209, true }, + { 171221, true }, + { 171233, false }, + { 171245, true }, + { 171259, true }, + { 171276, true }, + { 171286, true }, + { 171299, false }, + { 171317, false }, + { 171328, true }, + { 171345, true }, { 171362, true }, - { 171377, true }, - { 171402, true }, - { 171427, true }, - { 171440, true }, - { 171457, true }, + { 171379, true }, + { 171390, true }, + { 171405, true }, + { 171415, true }, + { 171430, true }, + { 171447, true }, + { 171458, true }, { 171476, true }, - { 171488, true }, - { 171508, true }, - { 171529, true }, - { 171543, true }, - { 171560, true }, - { 171585, true }, - { 171606, true }, - { 171628, true }, - { 171658, true }, - { 171679, true }, - { 171700, true }, - { 171724, true }, - { 171739, true }, - { 171752, true }, - { 171762, true }, - { 171785, true }, - { 171796, true }, - { 171803, true }, - { 171818, true }, - { 171837, true }, - { 171846, true }, - { 171853, true }, - { 171864, true }, - { 171883, true }, - { 171900, true }, - { 171916, true }, - { 171926, true }, - { 171937, true }, - { 171947, true }, + { 171487, true }, + { 171502, true }, + { 171517, true }, + { 171532, true }, + { 171557, true }, + { 171582, true }, + { 171595, true }, + { 171612, true }, + { 171631, true }, + { 171643, true }, + { 171663, true }, + { 171684, true }, + { 171698, true }, + { 171715, true }, + { 171740, true }, + { 171761, true }, + { 171783, true }, + { 171813, true }, + { 171834, true }, + { 171855, true }, + { 171879, true }, + { 171894, true }, + { 171907, true }, + { 171917, true }, + { 171940, true }, + { 171951, true }, { 171958, true }, - { 171970, true }, + { 171977, true }, { 171986, true }, - { 171996, true }, - { 172006, true }, - { 172016, true }, - { 172028, true }, - { 172039, true }, - { 172054, true }, - { 172078, true }, - { 172094, true }, - { 172108, true }, - { 172133, true }, - { 172141, true }, - { 172159, true }, - { 172170, true }, - { 172183, true }, + { 171993, true }, + { 172004, true }, + { 172023, true }, + { 172040, true }, + { 172056, true }, + { 172066, true }, + { 172077, true }, + { 172087, true }, + { 172098, true }, + { 172110, true }, + { 172126, true }, + { 172136, true }, + { 172146, true }, + { 172156, true }, + { 172168, true }, + { 172179, true }, { 172194, true }, - { 172209, true }, - { 172228, true }, - { 172240, true }, - { 172251, true }, - { 172266, true }, + { 172218, true }, + { 172234, true }, + { 172248, true }, + { 172273, true }, { 172281, true }, - { 172295, true }, - { 172311, true }, - { 172329, true }, - { 172341, true }, - { 172359, true }, - { 172379, true }, + { 172299, true }, + { 172310, true }, + { 172323, true }, + { 172334, true }, + { 172349, true }, + { 172368, true }, + { 172380, true }, { 172391, true }, - { 172408, true }, - { 172422, true }, - { 172437, true }, - { 172451, true }, - { 172465, true }, - { 172476, true }, - { 172493, true }, - { 172502, true }, - { 172515, true }, - { 172524, true }, - { 172542, true }, - { 172553, true }, - { 172564, true }, + { 172406, true }, + { 172420, true }, + { 172436, true }, + { 172454, true }, + { 172466, true }, + { 172484, true }, + { 172504, true }, + { 172516, true }, + { 172533, true }, + { 172547, true }, + { 172562, true }, { 172576, true }, - { 172597, true }, - { 172604, true }, - { 172615, true }, - { 172632, false }, - { 172658, false }, - { 172670, true }, - { 172683, true }, - { 172702, true }, - { 172719, true }, - { 172730, true }, - { 172747, true }, - { 172757, true }, - { 172770, true }, - { 172791, true }, - { 172807, true }, - { 172831, true }, - { 172845, true }, - { 172856, true }, - { 172870, true }, - { 172887, true }, - { 172897, true }, - { 172912, true }, - { 172924, true }, - { 172939, true }, - { 172949, true }, - { 172962, true }, - { 172975, true }, - { 172988, true }, - { 173008, true }, - { 173030, true }, - { 173044, true }, - { 173059, false }, - { 173072, true }, + { 172590, true }, + { 172601, true }, + { 172618, true }, + { 172627, true }, + { 172640, true }, + { 172649, true }, + { 172667, true }, + { 172678, true }, + { 172689, true }, + { 172701, true }, + { 172722, true }, + { 172729, true }, + { 172740, true }, + { 172757, false }, + { 172783, false }, + { 172795, true }, + { 172808, true }, + { 172827, true }, + { 172844, true }, + { 172855, true }, + { 172872, true }, + { 172882, true }, + { 172895, true }, + { 172916, true }, + { 172932, true }, + { 172956, true }, + { 172970, true }, + { 172981, true }, + { 172995, true }, + { 173012, true }, + { 173022, true }, + { 173037, true }, + { 173049, true }, + { 173064, true }, + { 173074, true }, { 173087, true }, - { 173098, true }, - { 173118, true }, - { 173134, true }, - { 173153, true }, - { 173167, true }, - { 173186, true }, - { 173207, true }, - { 173218, true }, - { 173237, true }, - { 173245, true }, - { 173253, true }, - { 173264, true }, - { 173273, true }, - { 173289, true }, - { 173298, true }, - { 173313, true }, - { 173324, true }, - { 173335, true }, - { 173346, true }, - { 173356, true }, - { 173366, true }, - { 173377, true }, - { 173387, true }, + { 173100, true }, + { 173113, true }, + { 173133, true }, + { 173155, true }, + { 173169, true }, + { 173184, false }, + { 173197, true }, + { 173212, true }, + { 173223, true }, + { 173243, true }, + { 173259, true }, + { 173278, true }, + { 173292, true }, + { 173311, true }, + { 173332, true }, + { 173343, true }, + { 173362, true }, + { 173370, true }, + { 173378, true }, + { 173389, true }, { 173398, true }, - { 173405, true }, + { 173414, true }, { 173423, true }, - { 173435, true }, - { 173446, true }, - { 173468, true }, - { 173482, true }, - { 173501, true }, - { 173509, true }, - { 173528, true }, - { 173550, true }, - { 173559, true }, + { 173438, true }, + { 173449, true }, + { 173460, true }, + { 173471, true }, + { 173481, true }, + { 173491, true }, + { 173502, true }, + { 173512, true }, + { 173523, true }, + { 173530, true }, + { 173548, true }, + { 173560, true }, { 173571, true }, - { 173589, true }, - { 173603, true }, - { 173615, true }, + { 173593, true }, + { 173607, true }, + { 173626, true }, { 173634, true }, - { 173644, true }, - { 173656, true }, - { 173665, true }, - { 173681, true }, - { 173689, true }, - { 173701, true }, - { 173716, true }, - { 173736, true }, - { 173744, true }, - { 173757, true }, - { 173774, true }, - { 173783, true }, - { 173801, true }, - { 173813, true }, - { 173832, true }, - { 173846, true }, - { 173866, true }, - { 173889, true }, - { 173902, true }, - { 173914, true }, + { 173653, true }, + { 173675, true }, + { 173684, true }, + { 173696, true }, + { 173714, true }, + { 173728, true }, + { 173740, true }, + { 173759, true }, + { 173769, true }, + { 173781, true }, + { 173790, true }, + { 173806, true }, + { 173814, true }, + { 173826, true }, + { 173841, true }, + { 173861, true }, + { 173869, true }, + { 173882, true }, + { 173899, true }, + { 173908, true }, + { 173926, true }, { 173938, true }, - { 173954, true }, - { 173977, true }, + { 173957, true }, + { 173971, true }, { 173991, true }, - { 174008, true }, - { 174024, true }, - { 174041, true }, - { 174056, true }, - { 174071, true }, - { 174090, true }, - { 174106, true }, - { 174114, true }, - { 174132, true }, - { 174141, false }, - { 174150, true }, - { 174162, true }, - { 174176, true }, - { 174190, true }, - { 174200, true }, - { 174211, true }, - { 174224, true }, - { 174233, true }, - { 174256, true }, - { 174268, true }, - { 174284, true }, - { 174294, false }, - { 174303, true }, - { 174310, true }, - { 174319, true }, - { 174327, true }, - { 174336, false }, - { 174350, true }, - { 174364, true }, - { 174374, true }, - { 174384, true }, - { 174394, true }, - { 174406, true }, - { 174419, true }, - { 174431, true }, - { 174443, true }, - { 174457, true }, - { 174475, false }, - { 174488, true }, - { 174503, true }, - { 174521, true }, + { 174014, true }, + { 174027, true }, + { 174039, true }, + { 174063, true }, + { 174079, true }, + { 174102, true }, + { 174116, true }, + { 174133, true }, + { 174149, true }, + { 174166, true }, + { 174181, true }, + { 174196, true }, + { 174215, true }, + { 174231, true }, + { 174239, true }, + { 174257, true }, + { 174266, false }, + { 174275, true }, + { 174287, true }, + { 174301, true }, + { 174315, true }, + { 174325, true }, + { 174336, true }, + { 174349, true }, + { 174358, true }, + { 174381, true }, + { 174393, true }, + { 174409, true }, + { 174419, false }, + { 174428, true }, + { 174435, true }, + { 174444, true }, + { 174452, true }, + { 174461, false }, + { 174475, true }, + { 174489, true }, + { 174499, true }, + { 174509, true }, + { 174519, true }, { 174531, true }, - { 174542, true }, - { 174554, true }, - { 174567, true }, - { 174581, true }, - { 174595, true }, - { 174605, true }, - { 174618, true }, + { 174544, true }, + { 174556, true }, + { 174568, true }, + { 174582, true }, + { 174600, false }, + { 174613, true }, { 174628, true }, - { 174639, true }, - { 174648, true }, - { 174665, true }, - { 174676, true }, - { 174685, true }, - { 174698, true }, - { 174709, true }, - { 174727, true }, - { 174737, true }, - { 174747, true }, - { 174759, true }, - { 174771, true }, - { 174786, true }, - { 174797, true }, - { 174813, true }, - { 174830, true }, - { 174843, true }, - { 174857, true }, - { 174866, true }, - { 174879, false }, - { 174888, false }, - { 174899, true }, - { 174915, false }, - { 174930, false }, - { 174941, false }, - { 174948, true }, - { 174964, true }, - { 174982, true }, - { 175001, true }, - { 175016, true }, - { 175033, true }, - { 175049, true }, - { 175070, true }, - { 175084, true }, - { 175109, true }, + { 174646, true }, + { 174656, true }, + { 174667, true }, + { 174679, true }, + { 174692, true }, + { 174706, true }, + { 174720, true }, + { 174730, true }, + { 174743, true }, + { 174753, true }, + { 174764, true }, + { 174773, true }, + { 174790, true }, + { 174801, true }, + { 174810, true }, + { 174823, true }, + { 174834, true }, + { 174852, true }, + { 174862, true }, + { 174872, true }, + { 174884, true }, + { 174896, true }, + { 174907, true }, + { 174923, true }, + { 174940, true }, + { 174953, true }, + { 174967, true }, + { 174976, true }, + { 174989, false }, + { 174998, false }, + { 175009, true }, + { 175025, false }, + { 175040, false }, + { 175051, false }, + { 175058, true }, + { 175074, true }, + { 175092, true }, + { 175111, true }, { 175126, true }, - { 175145, true }, - { 175160, false }, - { 175174, true }, - { 175188, true }, - { 175201, true }, - { 175222, true }, - { 175234, true }, - { 175247, true }, - { 175257, true }, - { 175277, true }, - { 175290, true }, - { 175309, true }, - { 175325, true }, - { 175343, true }, - { 175357, false }, - { 175369, true }, - { 175379, true }, - { 175393, true }, - { 175403, true }, + { 175143, true }, + { 175159, true }, + { 175180, true }, + { 175194, true }, + { 175219, true }, + { 175236, true }, + { 175255, true }, + { 175270, false }, + { 175284, true }, + { 175298, true }, + { 175311, true }, + { 175332, true }, + { 175344, true }, + { 175357, true }, + { 175367, true }, + { 175387, true }, + { 175400, true }, { 175419, true }, - { 175445, true }, - { 175473, true }, - { 175486, true }, - { 175501, true }, - { 175517, true }, - { 175541, true }, - { 175557, true }, - { 175572, true }, - { 175586, true }, - { 175598, true }, - { 175610, true }, - { 175622, false }, - { 175640, true }, - { 175653, true }, - { 175672, true }, - { 175690, true }, - { 175705, true }, - { 175728, true }, - { 175745, true }, - { 175764, true }, - { 175784, true }, - { 175807, true }, - { 175826, true }, - { 175845, true }, - { 175864, true }, - { 175882, true }, - { 175901, true }, - { 175912, true }, - { 175922, true }, - { 175937, true }, - { 175957, true }, - { 175978, true }, - { 175998, true }, - { 176017, true }, - { 176031, true }, - { 176055, true }, - { 176070, true }, - { 176084, true }, - { 176096, true }, - { 176106, true }, - { 176126, true }, - { 176156, true }, - { 176179, true }, - { 176202, true }, - { 176231, true }, - { 176249, true }, - { 176265, true }, - { 176277, true }, - { 176287, true }, - { 176307, false }, - { 176319, true }, - { 176332, true }, - { 176350, true }, - { 176367, true }, - { 176385, true }, - { 176405, true }, - { 176420, true }, + { 175435, true }, + { 175453, true }, + { 175467, false }, + { 175479, true }, + { 175489, true }, + { 175503, true }, + { 175513, true }, + { 175529, true }, + { 175555, true }, + { 175583, true }, + { 175596, true }, + { 175611, true }, + { 175627, true }, + { 175651, true }, + { 175667, true }, + { 175682, true }, + { 175696, true }, + { 175708, true }, + { 175720, true }, + { 175732, false }, + { 175750, true }, + { 175763, true }, + { 175782, true }, + { 175800, true }, + { 175815, true }, + { 175838, true }, + { 175855, true }, + { 175874, true }, + { 175894, true }, + { 175917, true }, + { 175936, true }, + { 175955, true }, + { 175974, true }, + { 175992, true }, + { 176011, true }, + { 176022, true }, + { 176032, true }, + { 176047, true }, + { 176067, true }, + { 176088, true }, + { 176108, true }, + { 176127, true }, + { 176141, true }, + { 176165, true }, + { 176180, true }, + { 176194, true }, + { 176206, true }, + { 176216, true }, + { 176236, true }, + { 176266, true }, + { 176289, true }, + { 176312, true }, + { 176341, true }, + { 176359, true }, + { 176375, true }, + { 176387, true }, + { 176397, true }, + { 176417, false }, { 176429, true }, { 176442, true }, - { 176454, true }, - { 176465, true }, + { 176460, true }, { 176477, true }, - { 176489, false }, - { 176506, true }, - { 176519, true }, - { 176537, true }, + { 176495, true }, + { 176515, true }, + { 176530, true }, + { 176539, true }, { 176552, true }, - { 176567, true }, - { 176581, true }, - { 176593, true }, - { 176613, true }, - { 176624, true }, - { 176636, true }, - { 176646, true }, - { 176660, true }, - { 176680, true }, - { 176694, true }, - { 176712, true }, - { 176725, true }, - { 176740, true }, + { 176564, true }, + { 176575, true }, + { 176587, true }, + { 176599, false }, + { 176616, true }, + { 176629, true }, + { 176647, true }, + { 176662, true }, + { 176677, true }, + { 176691, true }, + { 176703, true }, + { 176723, true }, + { 176734, true }, + { 176746, true }, { 176756, true }, - { 176771, true }, - { 176783, true }, - { 176798, true }, - { 176814, true }, - { 176824, true }, - { 176831, true }, - { 176846, true }, + { 176770, true }, + { 176790, true }, + { 176804, true }, + { 176822, true }, + { 176835, true }, + { 176850, true }, { 176866, true }, - { 176878, true }, - { 176889, true }, - { 176902, true }, - { 176911, true }, - { 176931, true }, - { 176951, true }, - { 176974, true }, - { 176994, true }, - { 177008, true }, - { 177020, true }, - { 177031, true }, + { 176881, true }, + { 176893, true }, + { 176908, true }, + { 176924, true }, + { 176934, true }, + { 176941, true }, + { 176956, true }, + { 176976, true }, + { 176988, true }, + { 176999, true }, + { 177012, true }, + { 177021, true }, { 177041, true }, - { 177052, false }, - { 177063, true }, - { 177074, true }, - { 177085, false }, - { 177095, false }, - { 177112, true }, - { 177124, true }, - { 177140, true }, - { 177153, true }, - { 177162, true }, - { 177176, true }, - { 177187, true }, - { 177199, true }, - { 177217, true }, - { 177231, true }, - { 177242, true }, - { 177253, true }, - { 177266, true }, - { 177279, true }, - { 177288, true }, - { 177303, true }, - { 177314, true }, - { 177332, true }, - { 177352, true }, - { 177364, true }, - { 177374, true }, - { 177385, true }, - { 177418, true }, - { 177430, true }, - { 177444, true }, - { 177458, true }, - { 177473, true }, - { 177487, true }, - { 177501, false }, - { 177521, true }, - { 177538, true }, - { 177551, true }, - { 177566, true }, - { 177582, true }, - { 177600, true }, - { 177616, true }, - { 177633, true }, - { 177645, true }, - { 177658, true }, - { 177671, true }, - { 177685, true }, - { 177698, true }, - { 177711, true }, - { 177727, true }, + { 177061, true }, + { 177084, true }, + { 177104, true }, + { 177116, true }, + { 177127, true }, + { 177137, true }, + { 177148, false }, + { 177159, true }, + { 177170, true }, + { 177181, false }, + { 177191, false }, + { 177208, true }, + { 177220, true }, + { 177236, true }, + { 177249, true }, + { 177258, true }, + { 177272, true }, + { 177283, true }, + { 177295, true }, + { 177313, true }, + { 177327, true }, + { 177338, true }, + { 177349, true }, + { 177362, true }, + { 177375, true }, + { 177384, true }, + { 177399, true }, + { 177410, true }, + { 177428, true }, + { 177448, true }, + { 177460, true }, + { 177470, true }, + { 177481, true }, + { 177514, true }, + { 177526, true }, + { 177540, true }, + { 177554, true }, + { 177569, true }, + { 177583, true }, + { 177597, false }, + { 177617, true }, + { 177634, true }, + { 177647, true }, + { 177662, true }, + { 177678, true }, + { 177696, true }, + { 177712, true }, + { 177729, true }, { 177741, true }, { 177754, true }, { 177767, true }, - { 177780, true }, - { 177793, true }, - { 177806, true }, - { 177821, true }, - { 177834, true }, - { 177848, true }, - { 177861, true }, - { 177875, true }, - { 177888, true }, - { 177901, true }, - { 177914, true }, - { 177927, true }, - { 177940, true }, - { 177952, true }, - { 177963, true }, - { 177970, true }, - { 177987, true }, - { 178000, true }, - { 178009, true }, - { 178020, true }, - { 178029, true }, - { 178042, true }, - { 178073, true }, - { 178090, true }, - { 178103, true }, + { 177781, true }, + { 177794, true }, + { 177807, true }, + { 177823, true }, + { 177837, true }, + { 177850, true }, + { 177863, true }, + { 177876, true }, + { 177889, true }, + { 177902, true }, + { 177917, true }, + { 177930, true }, + { 177944, true }, + { 177957, true }, + { 177971, true }, + { 177984, true }, + { 177997, true }, + { 178010, true }, + { 178023, true }, + { 178036, true }, + { 178048, true }, + { 178059, true }, + { 178066, true }, + { 178083, true }, + { 178096, true }, + { 178105, true }, { 178116, true }, - { 178129, true }, - { 178142, true }, - { 178153, true }, - { 178162, true }, - { 178172, true }, - { 178187, true }, + { 178125, true }, + { 178138, true }, + { 178169, true }, + { 178186, true }, { 178199, true }, - { 178215, true }, - { 178240, true }, - { 178264, true }, - { 178285, true }, - { 178302, false }, - { 178315, true }, - { 178329, true }, - { 178342, true }, - { 178353, true }, - { 178370, true }, + { 178212, true }, + { 178225, true }, + { 178238, true }, + { 178249, true }, + { 178258, true }, + { 178268, true }, + { 178283, true }, + { 178295, true }, + { 178311, true }, + { 178336, true }, + { 178360, true }, { 178381, true }, - { 178400, true }, - { 178418, false }, - { 178430, true }, - { 178443, true }, - { 178453, true }, - { 178489, true }, - { 178502, true }, - { 178516, true }, - { 178529, true }, - { 178538, true }, - { 178546, false }, - { 178556, true }, - { 178570, true }, - { 178582, true }, - { 178600, true }, - { 178614, true }, - { 178632, true }, - { 178653, true }, - { 178673, true }, + { 178398, false }, + { 178411, true }, + { 178425, true }, + { 178438, true }, + { 178449, true }, + { 178466, true }, + { 178477, true }, + { 178496, true }, + { 178514, false }, + { 178526, true }, + { 178539, true }, + { 178549, true }, + { 178585, true }, + { 178598, true }, + { 178612, true }, + { 178625, true }, + { 178634, true }, + { 178642, false }, + { 178652, true }, + { 178666, true }, + { 178678, true }, { 178696, true }, - { 178712, true }, - { 178729, true }, - { 178743, true }, - { 178759, true }, - { 178772, true }, - { 178793, true }, - { 178813, true }, - { 178827, true }, - { 178837, true }, - { 178850, true }, - { 178859, true }, - { 178893, true }, - { 178910, true }, - { 178921, true }, - { 178932, true }, - { 178944, true }, - { 178958, true }, - { 178977, true }, + { 178710, true }, + { 178728, true }, + { 178749, true }, + { 178769, true }, + { 178792, true }, + { 178808, true }, + { 178825, true }, + { 178839, true }, + { 178855, true }, + { 178868, true }, + { 178889, true }, + { 178909, true }, + { 178923, true }, + { 178933, true }, + { 178946, true }, + { 178955, true }, { 178989, true }, - { 179002, true }, - { 179018, true }, - { 179037, true }, - { 179052, true }, - { 179066, true }, - { 179081, true }, - { 179098, false }, - { 179113, true }, - { 179133, true }, + { 179006, true }, + { 179017, true }, + { 179028, true }, + { 179040, true }, + { 179054, true }, + { 179065, true }, + { 179084, true }, + { 179096, true }, + { 179109, true }, + { 179125, true }, { 179144, true }, - { 179164, false }, + { 179159, true }, { 179173, true }, - { 179182, true }, - { 179193, true }, - { 179205, true }, - { 179219, true }, - { 179237, true }, - { 179249, true }, - { 179264, true }, - { 179276, true }, - { 179287, false }, - { 179304, true }, - { 179314, true }, - { 179335, true }, - { 179363, false }, - { 179374, true }, - { 179394, true }, - { 179401, true }, - { 179412, true }, - { 179422, true }, - { 179432, true }, - { 179446, true }, - { 179460, true }, - { 179471, false }, - { 179482, true }, - { 179490, false }, - { 179510, true }, - { 179525, true }, - { 179538, true }, - { 179554, true }, - { 179569, true }, - { 179585, true }, - { 179599, true }, - { 179614, true }, - { 179627, true }, - { 179643, true }, - { 179656, true }, - { 179665, true }, - { 179685, true }, - { 179698, true }, - { 179717, true }, - { 179735, true }, - { 179745, true }, - { 179759, true }, - { 179777, true }, - { 179785, true }, + { 179188, true }, + { 179205, false }, + { 179220, true }, + { 179240, true }, + { 179251, true }, + { 179271, false }, + { 179280, true }, + { 179289, true }, + { 179300, true }, + { 179312, true }, + { 179326, true }, + { 179344, true }, + { 179356, true }, + { 179371, true }, + { 179383, true }, + { 179394, false }, + { 179411, true }, + { 179421, true }, + { 179442, true }, + { 179470, false }, + { 179481, true }, + { 179501, true }, + { 179508, true }, + { 179519, true }, + { 179529, true }, + { 179539, true }, + { 179553, true }, + { 179567, true }, + { 179578, false }, + { 179589, true }, + { 179597, false }, + { 179617, true }, + { 179632, true }, + { 179645, true }, + { 179661, true }, + { 179676, true }, + { 179692, true }, + { 179706, true }, + { 179721, true }, + { 179734, true }, + { 179750, true }, + { 179763, true }, + { 179772, true }, + { 179792, true }, { 179805, true }, - { 179837, true }, - { 179851, true }, + { 179824, true }, + { 179842, true }, + { 179852, true }, { 179866, true }, - { 179885, true }, - { 179904, true }, - { 179921, true }, - { 179934, true }, - { 179949, true }, - { 179970, true }, - { 179991, true }, - { 180005, true }, - { 180027, true }, - { 180043, true }, - { 180068, true }, - { 180080, true }, - { 180091, true }, - { 180108, true }, - { 180132, true }, - { 180141, true }, - { 180155, true }, - { 180168, true }, - { 180181, true }, - { 180193, true }, - { 180206, true }, - { 180224, true }, - { 180241, true }, - { 180266, true }, - { 180279, true }, - { 180294, true }, - { 180306, true }, - { 180320, true }, - { 180334, true }, - { 180351, true }, - { 180371, true }, - { 180387, true }, - { 180405, true }, - { 180416, true }, - { 180431, true }, - { 180444, true }, - { 180459, true }, - { 180467, false }, - { 180480, true }, - { 180492, true }, - { 180507, true }, - { 180521, true }, - { 180530, true }, - { 180539, true }, - { 180555, true }, - { 180577, true }, - { 180594, true }, - { 180608, true }, - { 180618, true }, - { 180632, true }, - { 180650, true }, - { 180667, true }, - { 180686, true }, - { 180703, true }, - { 180721, true }, + { 179884, true }, + { 179892, true }, + { 179912, true }, + { 179944, true }, + { 179958, true }, + { 179973, true }, + { 179992, true }, + { 180011, true }, + { 180028, true }, + { 180041, true }, + { 180056, true }, + { 180077, true }, + { 180098, true }, + { 180112, true }, + { 180134, true }, + { 180150, true }, + { 180175, true }, + { 180187, true }, + { 180198, true }, + { 180215, true }, + { 180239, true }, + { 180248, true }, + { 180262, true }, + { 180275, true }, + { 180288, true }, + { 180300, true }, + { 180313, true }, + { 180331, true }, + { 180348, true }, + { 180373, true }, + { 180386, true }, + { 180401, true }, + { 180413, true }, + { 180427, true }, + { 180441, true }, + { 180458, true }, + { 180478, true }, + { 180494, true }, + { 180512, true }, + { 180523, true }, + { 180538, true }, + { 180551, true }, + { 180566, true }, + { 180574, false }, + { 180587, true }, + { 180599, true }, + { 180614, true }, + { 180628, true }, + { 180637, true }, + { 180646, true }, + { 180662, true }, + { 180684, true }, + { 180701, true }, + { 180715, true }, + { 180725, true }, { 180739, true }, - { 180752, true }, - { 180760, true }, - { 180772, true }, - { 180783, true }, - { 180799, true }, - { 180812, true }, - { 180825, true }, - { 180839, true }, - { 180855, true }, - { 180868, true }, - { 180882, true }, - { 180899, true }, - { 180910, true }, - { 180920, true }, - { 180940, true }, - { 180952, true }, - { 180966, true }, - { 180981, true }, - { 180993, true }, - { 181002, true }, - { 181010, true }, - { 181022, true }, - { 181033, true }, + { 180757, true }, + { 180774, true }, + { 180793, true }, + { 180810, true }, + { 180828, true }, + { 180846, true }, + { 180859, true }, + { 180867, true }, + { 180879, true }, + { 180890, true }, + { 180906, true }, + { 180919, true }, + { 180932, true }, + { 180946, true }, + { 180962, true }, + { 180975, true }, + { 180989, true }, + { 181006, true }, + { 181017, true }, + { 181027, true }, { 181047, true }, - { 181068, true }, - { 181087, true }, - { 181105, true }, - { 181123, true }, - { 181143, true }, - { 181152, true }, - { 181164, true }, - { 181186, true }, - { 181204, true }, - { 181217, true }, - { 181231, true }, + { 181059, true }, + { 181073, true }, + { 181088, true }, + { 181100, true }, + { 181109, true }, + { 181117, true }, + { 181129, true }, + { 181140, true }, + { 181154, true }, + { 181175, true }, + { 181194, true }, + { 181212, true }, + { 181230, true }, { 181250, true }, - { 181263, true }, - { 181275, true }, - { 181287, true }, - { 181298, true }, - { 181312, true }, - { 181326, false }, - { 181341, true }, - { 181361, true }, - { 181374, true }, - { 181391, true }, - { 181402, true }, - { 181413, true }, - { 181427, true }, - { 181448, true }, - { 181464, true }, - { 181475, true }, - { 181494, true }, - { 181510, true }, - { 181528, true }, - { 181544, true }, - { 181567, true }, - { 181583, true }, - { 181595, true }, - { 181604, true }, - { 181617, true }, - { 181635, true }, - { 181650, true }, - { 181665, true }, - { 181681, true }, - { 181696, true }, - { 181711, true }, - { 181727, true }, - { 181742, true }, - { 181757, true }, + { 181259, true }, + { 181271, true }, + { 181293, true }, + { 181311, true }, + { 181324, true }, + { 181338, true }, + { 181357, true }, + { 181370, true }, + { 181382, true }, + { 181394, true }, + { 181405, true }, + { 181419, false }, + { 181434, true }, + { 181454, true }, + { 181467, true }, + { 181484, true }, + { 181495, true }, + { 181506, true }, + { 181520, true }, + { 181541, true }, + { 181557, true }, + { 181568, true }, + { 181587, true }, + { 181603, true }, + { 181621, true }, + { 181637, true }, + { 181660, true }, + { 181676, true }, + { 181688, true }, + { 181697, true }, + { 181710, true }, + { 181728, true }, + { 181743, true }, + { 181758, true }, { 181774, true }, - { 181784, true }, - { 181797, true }, - { 181810, true }, + { 181789, true }, + { 181804, true }, { 181820, true }, - { 181841, true }, - { 181853, false }, - { 181864, true }, - { 181878, true }, + { 181835, true }, + { 181850, true }, + { 181867, true }, + { 181877, true }, { 181890, true }, - { 181899, true }, - { 181914, false }, - { 181933, true }, - { 181950, true }, - { 181963, true }, - { 181978, true }, + { 181903, true }, + { 181913, true }, + { 181934, true }, + { 181946, false }, + { 181957, true }, + { 181971, true }, + { 181983, true }, { 181992, true }, - { 182002, false }, - { 182015, false }, - { 182025, true }, - { 182038, true }, - { 182048, true }, - { 182060, true }, - { 182070, false }, - { 182079, false }, - { 182087, true }, + { 182007, false }, + { 182026, true }, + { 182043, true }, + { 182056, true }, + { 182071, true }, + { 182085, true }, { 182095, false }, - { 182115, true }, - { 182128, true }, - { 182146, true }, - { 182158, false }, - { 182170, true }, - { 182187, true }, - { 182201, true }, - { 182218, true }, - { 182234, true }, - { 182253, true }, - { 182269, true }, - { 182286, true }, - { 182306, true }, - { 182320, true }, - { 182334, true }, - { 182348, true }, + { 182108, false }, + { 182118, true }, + { 182131, true }, + { 182141, true }, + { 182153, true }, + { 182163, false }, + { 182172, false }, + { 182180, true }, + { 182188, false }, + { 182208, true }, + { 182221, true }, + { 182239, true }, + { 182251, false }, + { 182263, true }, + { 182280, true }, + { 182294, true }, + { 182311, true }, + { 182327, true }, + { 182346, true }, { 182362, true }, - { 182383, true }, - { 182397, true }, + { 182379, true }, + { 182399, true }, { 182413, true }, - { 182426, true }, + { 182427, true }, + { 182441, true }, { 182455, true }, - { 182469, true }, - { 182488, false }, - { 182510, true }, - { 182525, true }, - { 182542, true }, - { 182550, true }, + { 182476, true }, + { 182490, true }, + { 182506, true }, + { 182519, true }, + { 182548, true }, { 182562, true }, - { 182575, true }, - { 182588, true }, - { 182601, false }, - { 182612, true }, - { 182623, true }, - { 182641, true }, - { 182660, true }, - { 182676, true }, - { 182692, true }, - { 182701, false }, - { 182715, true }, - { 182733, true }, - { 182751, true }, - { 182768, true }, - { 182779, false }, - { 182795, false }, - { 182819, true }, - { 182833, true }, - { 182860, true }, - { 182875, true }, - { 182894, true }, - { 182904, true }, - { 182949, true }, - { 182994, true }, - { 183008, true }, - { 183016, true }, - { 183025, true }, - { 183033, true }, - { 183045, true }, - { 183057, true }, - { 183071, true }, - { 183096, true }, - { 183113, true }, - { 183130, true }, - { 183145, true }, - { 183157, true }, - { 183169, true }, - { 183182, true }, - { 183190, true }, - { 183208, true }, - { 183217, false }, - { 183225, true }, - { 183237, true }, - { 183258, true }, - { 183271, true }, - { 183284, true }, - { 183296, true }, - { 183308, true }, - { 183321, false }, - { 183334, true }, - { 183350, true }, + { 182581, false }, + { 182603, true }, + { 182618, true }, + { 182635, true }, + { 182643, true }, + { 182655, true }, + { 182668, true }, + { 182681, true }, + { 182694, false }, + { 182705, true }, + { 182716, true }, + { 182734, true }, + { 182753, true }, + { 182769, true }, + { 182785, true }, + { 182794, false }, + { 182808, true }, + { 182826, true }, + { 182844, true }, + { 182861, true }, + { 182872, false }, + { 182888, false }, + { 182912, true }, + { 182926, true }, + { 182953, true }, + { 182968, true }, + { 182987, true }, + { 182997, true }, + { 183042, true }, + { 183087, true }, + { 183101, true }, + { 183109, true }, + { 183118, true }, + { 183126, true }, + { 183138, true }, + { 183150, true }, + { 183164, true }, + { 183189, true }, + { 183206, true }, + { 183223, true }, + { 183238, true }, + { 183250, true }, + { 183262, true }, + { 183275, true }, + { 183283, true }, + { 183301, true }, + { 183310, false }, + { 183318, true }, + { 183330, true }, + { 183351, true }, { 183364, true }, - { 183382, true }, - { 183403, true }, - { 183424, true }, + { 183377, true }, + { 183389, true }, + { 183401, true }, + { 183414, false }, + { 183427, true }, { 183443, true }, - { 183468, true }, - { 183477, true }, - { 183490, true }, - { 183503, true }, - { 183515, true }, - { 183527, true }, - { 183546, true }, - { 183558, true }, - { 183575, true }, - { 183587, false }, + { 183457, true }, + { 183475, true }, + { 183496, true }, + { 183517, true }, + { 183536, true }, + { 183561, true }, + { 183570, true }, + { 183583, true }, { 183596, true }, - { 183605, true }, + { 183608, true }, { 183620, true }, - { 183642, true }, - { 183661, true }, - { 183676, true }, - { 183691, true }, - { 183705, true }, - { 183718, true }, - { 183740, true }, - { 183755, true }, - { 183770, true }, - { 183785, true }, - { 183796, true }, - { 183805, true }, - { 183830, true }, - { 183842, true }, - { 183859, true }, - { 183871, true }, - { 183887, false }, - { 183903, true }, - { 183914, false }, - { 183929, true }, - { 183942, false }, - { 183966, true }, - { 183974, true }, - { 183985, true }, + { 183639, true }, + { 183651, true }, + { 183668, true }, + { 183680, false }, + { 183689, true }, + { 183698, true }, + { 183713, true }, + { 183735, true }, + { 183754, true }, + { 183769, true }, + { 183784, true }, + { 183798, true }, + { 183811, true }, + { 183833, true }, + { 183848, true }, + { 183863, true }, + { 183878, true }, + { 183889, true }, + { 183898, true }, + { 183923, true }, + { 183935, true }, + { 183952, true }, + { 183964, true }, + { 183980, false }, { 183996, true }, - { 184007, true }, - { 184018, true }, - { 184029, false }, - { 184042, true }, - { 184056, true }, - { 184068, true }, - { 184081, true }, - { 184093, true }, - { 184109, true }, - { 184124, true }, - { 184143, true }, - { 184167, true }, - { 184181, true }, - { 184195, true }, - { 184215, true }, - { 184231, true }, - { 184250, true }, - { 184270, true }, - { 184282, true }, - { 184305, true }, - { 184322, true }, - { 184352, true }, - { 184364, true }, - { 184375, true }, - { 184385, true }, - { 184399, true }, - { 184412, true }, - { 184430, false }, - { 184440, true }, + { 184007, false }, + { 184022, true }, + { 184035, false }, + { 184059, true }, + { 184067, true }, + { 184078, true }, + { 184089, true }, + { 184100, true }, + { 184111, true }, + { 184122, false }, + { 184135, true }, + { 184149, true }, + { 184161, true }, + { 184174, true }, + { 184186, true }, + { 184202, true }, + { 184217, true }, + { 184236, true }, + { 184260, true }, + { 184274, true }, + { 184294, true }, + { 184310, true }, + { 184329, true }, + { 184349, true }, + { 184361, true }, + { 184384, true }, + { 184401, true }, + { 184431, true }, + { 184443, true }, { 184454, true }, - { 184469, true }, - { 184487, true }, - { 184496, true }, + { 184464, true }, + { 184478, true }, + { 184491, true }, { 184509, false }, - { 184526, true }, - { 184537, true }, - { 184547, true }, - { 184556, true }, - { 184577, true }, - { 184588, true }, - { 184610, true }, + { 184519, true }, + { 184533, true }, + { 184548, true }, + { 184566, true }, + { 184575, true }, + { 184588, false }, + { 184605, true }, + { 184616, true }, { 184626, true }, - { 184641, true }, - { 184661, true }, - { 184676, true }, - { 184693, true }, - { 184715, true }, - { 184725, true }, - { 184747, true }, - { 184766, true }, - { 184788, true }, - { 184805, true }, - { 184819, true }, - { 184832, true }, - { 184849, true }, - { 184874, true }, - { 184891, true }, - { 184907, true }, - { 184917, true }, + { 184635, true }, + { 184656, true }, + { 184667, true }, + { 184689, true }, + { 184705, true }, + { 184720, true }, + { 184740, true }, + { 184755, true }, + { 184772, true }, + { 184794, true }, + { 184804, true }, + { 184826, true }, + { 184845, true }, + { 184867, true }, + { 184884, true }, + { 184898, true }, + { 184911, true }, { 184928, true }, - { 184937, false }, - { 184946, true }, { 184953, true }, - { 184963, true }, - { 184977, true }, - { 184995, true }, - { 185015, true }, - { 185029, true }, - { 185038, true }, - { 185062, true }, - { 185083, true }, - { 185103, true }, - { 185121, true }, - { 185134, true }, - { 185155, true }, - { 185173, true }, - { 185185, true }, - { 185193, true }, - { 185215, true }, - { 185228, true }, - { 185253, true }, - { 185264, true }, - { 185285, true }, - { 185296, true }, - { 185317, true }, - { 185332, true }, - { 185344, true }, - { 185361, true }, - { 185387, true }, - { 185404, true }, - { 185433, false }, - { 185451, true }, - { 185467, true }, + { 184970, true }, + { 184986, true }, + { 184996, true }, + { 185007, true }, + { 185016, false }, + { 185025, true }, + { 185032, true }, + { 185042, true }, + { 185056, true }, + { 185074, true }, + { 185094, true }, + { 185108, true }, + { 185117, true }, + { 185141, true }, + { 185162, true }, + { 185182, true }, + { 185200, true }, + { 185213, true }, + { 185230, true }, + { 185251, true }, + { 185269, true }, + { 185281, true }, + { 185289, true }, + { 185311, true }, + { 185324, true }, + { 185349, true }, + { 185360, true }, + { 185381, true }, + { 185392, true }, + { 185413, true }, + { 185428, true }, + { 185440, true }, + { 185457, true }, { 185483, true }, - { 185502, false }, - { 185521, true }, - { 185533, true }, - { 185553, true }, - { 185566, true }, - { 185588, true }, - { 185601, true }, - { 185616, true }, - { 185630, true }, - { 185653, true }, - { 185663, true }, - { 185673, true }, - { 185692, true }, - { 185705, true }, - { 185727, true }, - { 185747, true }, - { 185757, true }, - { 185776, true }, + { 185500, true }, + { 185529, false }, + { 185547, true }, + { 185563, true }, + { 185579, true }, + { 185598, false }, + { 185617, true }, + { 185629, true }, + { 185649, true }, + { 185662, true }, + { 185684, true }, + { 185697, true }, + { 185712, true }, + { 185726, true }, + { 185749, true }, + { 185759, true }, + { 185769, true }, { 185788, true }, { 185801, true }, - { 185814, true }, - { 185835, true }, - { 185861, true }, - { 185882, true }, - { 185903, true }, - { 185924, true }, - { 185944, true }, - { 185956, true }, - { 185976, true }, - { 185990, true }, - { 186008, true }, - { 186026, true }, - { 186038, true }, - { 186047, true }, - { 186070, true }, + { 185823, true }, + { 185843, true }, + { 185853, true }, + { 185872, true }, + { 185884, true }, + { 185897, true }, + { 185910, true }, + { 185931, true }, + { 185957, true }, + { 185978, true }, + { 185999, true }, + { 186020, true }, + { 186040, true }, + { 186052, true }, + { 186072, true }, { 186086, true }, - { 186098, true }, - { 186116, true }, - { 186141, true }, - { 186156, true }, - { 186177, true }, - { 186193, true }, - { 186210, true }, - { 186231, false }, - { 186248, false }, - { 186266, true }, - { 186276, true }, - { 186290, true }, - { 186304, true }, - { 186314, true }, - { 186326, true }, - { 186338, true }, - { 186348, true }, - { 186359, true }, - { 186373, true }, - { 186385, true }, - { 186409, true }, - { 186421, true }, - { 186450, true }, - { 186465, true }, - { 186479, true }, - { 186493, true }, - { 186509, true }, - { 186524, true }, - { 186538, true }, - { 186550, true }, - { 186570, true }, - { 186583, true }, - { 186597, true }, - { 186610, true }, - { 186622, true }, - { 186635, true }, - { 186647, true }, - { 186665, true }, - { 186677, true }, - { 186696, true }, - { 186713, true }, - { 186734, true }, + { 186104, true }, + { 186122, true }, + { 186134, true }, + { 186143, true }, + { 186166, true }, + { 186182, true }, + { 186194, true }, + { 186212, true }, + { 186237, true }, + { 186252, true }, + { 186273, true }, + { 186289, true }, + { 186306, true }, + { 186327, false }, + { 186344, false }, + { 186362, true }, + { 186372, true }, + { 186386, true }, + { 186400, true }, + { 186410, true }, + { 186422, true }, + { 186434, true }, + { 186444, true }, + { 186455, true }, + { 186466, true }, + { 186480, true }, + { 186492, true }, + { 186516, true }, + { 186528, true }, + { 186557, true }, + { 186572, true }, + { 186586, true }, + { 186602, true }, + { 186617, true }, + { 186631, true }, + { 186643, true }, + { 186663, true }, + { 186676, true }, + { 186690, true }, + { 186703, true }, + { 186715, true }, + { 186728, true }, + { 186740, true }, { 186758, true }, - { 186781, true }, - { 186793, true }, - { 186811, true }, - { 186829, true }, - { 186845, true }, - { 186865, false }, - { 186883, true }, - { 186903, true }, - { 186918, true }, - { 186944, true }, - { 186970, true }, - { 186983, true }, + { 186770, true }, + { 186789, true }, + { 186806, true }, + { 186827, true }, + { 186851, true }, + { 186874, true }, + { 186886, true }, + { 186904, true }, + { 186922, true }, + { 186938, true }, + { 186958, false }, + { 186976, true }, { 186996, true }, - { 187016, true }, - { 187027, true }, + { 187011, true }, { 187037, true }, - { 187056, true }, - { 187075, true }, + { 187063, true }, + { 187076, true }, { 187089, true }, - { 187107, true }, - { 187122, true }, - { 187138, false }, + { 187109, true }, + { 187117, true }, + { 187128, true }, + { 187138, true }, { 187157, true }, - { 187171, true }, - { 187180, true }, - { 187197, true }, - { 187213, true }, - { 187235, true }, - { 187252, true }, - { 187270, true }, - { 187289, true }, - { 187306, true }, - { 187319, true }, - { 187329, true }, - { 187344, true }, - { 187352, true }, - { 187370, true }, - { 187398, true }, - { 187413, true }, - { 187428, true }, - { 187446, true }, - { 187463, true }, - { 187477, true }, - { 187492, false }, - { 187505, false }, - { 187515, false }, - { 187528, false }, - { 187543, true }, - { 187561, true }, + { 187176, true }, + { 187190, true }, + { 187208, true }, + { 187223, true }, + { 187239, false }, + { 187258, true }, + { 187272, true }, + { 187281, true }, + { 187298, true }, + { 187314, true }, + { 187336, true }, + { 187353, true }, + { 187371, true }, + { 187390, true }, + { 187407, true }, + { 187420, true }, + { 187430, true }, + { 187445, true }, + { 187453, true }, + { 187471, true }, + { 187499, true }, + { 187514, true }, + { 187529, true }, + { 187547, true }, + { 187564, true }, { 187578, true }, - { 187590, true }, - { 187602, true }, - { 187614, true }, - { 187630, true }, - { 187642, true }, - { 187655, true }, - { 187667, true }, + { 187593, false }, + { 187606, false }, + { 187616, false }, + { 187629, false }, + { 187644, true }, + { 187662, true }, { 187679, true }, - { 187695, true }, - { 187708, true }, - { 187718, true }, - { 187728, true }, - { 187741, true }, + { 187691, true }, + { 187703, true }, + { 187715, true }, + { 187731, true }, + { 187743, true }, { 187756, true }, - { 187767, true }, - { 187779, true }, - { 187790, true }, - { 187808, true }, - { 187816, true }, - { 187824, true }, - { 187834, true }, - { 187846, true }, - { 187860, true }, - { 187874, true }, - { 187887, true }, - { 187904, true }, - { 187934, true }, + { 187768, true }, + { 187780, true }, + { 187796, true }, + { 187809, true }, + { 187819, true }, + { 187829, true }, + { 187842, true }, + { 187857, true }, + { 187868, true }, + { 187880, true }, + { 187891, true }, + { 187909, true }, + { 187917, true }, + { 187925, true }, + { 187935, true }, + { 187947, true }, { 187961, true }, - { 187976, true }, - { 187992, true }, - { 188007, true }, - { 188022, true }, - { 188037, true }, - { 188045, true }, - { 188060, true }, - { 188071, true }, - { 188084, true }, - { 188092, true }, - { 188102, true }, - { 188118, true }, - { 188135, true }, - { 188160, true }, - { 188177, true }, - { 188198, true }, - { 188211, true }, - { 188223, true }, - { 188231, true }, - { 188248, true }, - { 188264, true }, - { 188271, true }, - { 188279, true }, - { 188291, false }, - { 188315, true }, - { 188347, true }, - { 188374, true }, - { 188394, true }, - { 188418, true }, - { 188435, false }, + { 187975, true }, + { 187988, true }, + { 188005, true }, + { 188035, true }, + { 188062, true }, + { 188077, true }, + { 188093, true }, + { 188108, true }, + { 188123, true }, + { 188138, true }, + { 188146, true }, + { 188161, true }, + { 188172, true }, + { 188185, true }, + { 188193, true }, + { 188203, true }, + { 188219, true }, + { 188236, true }, + { 188261, true }, + { 188278, true }, + { 188299, true }, + { 188312, true }, + { 188324, true }, + { 188332, true }, + { 188349, true }, + { 188365, true }, + { 188372, true }, + { 188380, true }, + { 188392, false }, + { 188416, true }, { 188448, true }, - { 188463, true }, - { 188474, true }, - { 188485, true }, + { 188475, true }, { 188495, true }, - { 188508, true }, - { 188516, true }, - { 188528, true }, - { 188540, false }, - { 188552, false }, - { 188560, false }, - { 188585, true }, - { 188604, true }, + { 188519, true }, + { 188536, false }, + { 188549, true }, + { 188564, true }, + { 188575, true }, + { 188586, true }, + { 188596, true }, + { 188609, true }, { 188617, true }, - { 188632, true }, - { 188646, true }, - { 188659, true }, - { 188671, true }, - { 188688, true }, - { 188702, true }, - { 188719, true }, - { 188731, true }, - { 188745, true }, + { 188629, true }, + { 188641, false }, + { 188653, false }, + { 188661, false }, + { 188686, true }, + { 188705, true }, + { 188718, true }, + { 188733, true }, + { 188747, true }, { 188760, true }, - { 188775, true }, - { 188786, true }, - { 188793, true }, - { 188813, true }, - { 188827, true }, - { 188835, true }, - { 188843, false }, - { 188858, true }, - { 188870, true }, - { 188884, false }, - { 188895, true }, - { 188906, true }, - { 188919, true }, - { 188929, true }, - { 188939, true }, - { 188946, true }, + { 188772, true }, + { 188789, true }, + { 188803, true }, + { 188820, true }, + { 188832, true }, + { 188846, true }, + { 188861, true }, + { 188876, true }, + { 188887, true }, + { 188894, true }, + { 188914, true }, + { 188928, true }, + { 188936, true }, + { 188944, false }, { 188959, true }, - { 188972, true }, - { 188980, true }, - { 188997, true }, - { 189005, true }, - { 189014, true }, + { 188971, true }, + { 188985, false }, + { 188996, true }, + { 189007, true }, + { 189020, true }, { 189030, true }, - { 189049, true }, + { 189040, true }, + { 189047, true }, { 189060, true }, - { 189072, true }, - { 189082, true }, - { 189099, false }, - { 189110, true }, - { 189118, true }, - { 189128, true }, - { 189137, true }, - { 189153, true }, - { 189174, true }, - { 189199, false }, - { 189215, true }, - { 189227, true }, - { 189239, true }, - { 189252, true }, - { 189260, true }, - { 189268, false }, - { 189288, false }, - { 189307, false }, - { 189326, false }, - { 189346, true }, - { 189366, false }, - { 189386, false }, - { 189405, false }, - { 189424, true }, - { 189443, true }, - { 189454, true }, - { 189464, true }, - { 189476, true }, - { 189485, true }, - { 189498, true }, - { 189513, true }, - { 189523, true }, - { 189536, false }, - { 189547, true }, - { 189558, true }, - { 189567, true }, - { 189579, true }, - { 189587, true }, - { 189600, true }, - { 189608, true }, - { 189618, true }, - { 189627, true }, - { 189642, true }, - { 189665, true }, - { 189684, false }, - { 189695, true }, - { 189717, true }, - { 189731, true }, - { 189740, true }, - { 189749, true }, - { 189757, true }, - { 189769, true }, - { 189786, true }, - { 189795, true }, - { 189802, true }, - { 189810, true }, - { 189821, true }, - { 189835, true }, - { 189847, true }, - { 189859, true }, - { 189868, true }, + { 189073, true }, + { 189081, true }, + { 189098, true }, + { 189106, true }, + { 189115, true }, + { 189131, true }, + { 189150, true }, + { 189161, true }, + { 189173, true }, + { 189183, true }, + { 189200, false }, + { 189211, true }, + { 189219, true }, + { 189229, true }, + { 189238, true }, + { 189254, true }, + { 189275, true }, + { 189300, false }, + { 189316, true }, + { 189328, true }, + { 189340, true }, + { 189353, true }, + { 189361, true }, + { 189369, false }, + { 189389, false }, + { 189408, false }, + { 189427, false }, + { 189447, true }, + { 189467, false }, + { 189487, false }, + { 189506, false }, + { 189525, true }, + { 189544, true }, + { 189555, true }, + { 189565, true }, + { 189577, true }, + { 189586, true }, + { 189599, true }, + { 189614, true }, + { 189624, true }, + { 189637, false }, + { 189648, true }, + { 189659, true }, + { 189668, true }, + { 189680, true }, + { 189688, true }, + { 189701, true }, + { 189709, true }, + { 189719, true }, + { 189728, true }, + { 189743, true }, + { 189766, true }, + { 189785, false }, + { 189796, true }, + { 189818, true }, + { 189832, true }, + { 189841, true }, + { 189848, true }, + { 189857, true }, + { 189865, true }, { 189877, true }, - { 189889, false }, - { 189900, true }, - { 189913, true }, - { 189939, true }, - { 189962, false }, - { 189982, true }, - { 189999, true }, - { 190014, true }, - { 190028, true }, + { 189894, true }, + { 189903, true }, + { 189910, true }, + { 189918, true }, + { 189929, true }, + { 189943, true }, + { 189955, true }, + { 189967, true }, + { 189976, true }, + { 189985, true }, + { 189997, false }, + { 190008, true }, + { 190021, true }, { 190047, true }, - { 190062, true }, - { 190078, true }, - { 190091, true }, - { 190102, true }, - { 190117, true }, - { 190137, true }, - { 190157, true }, - { 190172, true }, - { 190189, true }, - { 190198, true }, - { 190218, true }, - { 190236, true }, - { 190251, true }, - { 190272, true }, - { 190292, true }, - { 190307, true }, - { 190322, true }, - { 190337, true }, - { 190352, true }, - { 190366, true }, + { 190070, false }, + { 190090, true }, + { 190107, true }, + { 190122, true }, + { 190136, true }, + { 190155, true }, + { 190170, true }, + { 190186, true }, + { 190199, true }, + { 190210, true }, + { 190225, true }, + { 190245, true }, + { 190265, true }, + { 190280, true }, + { 190297, true }, + { 190306, true }, + { 190326, true }, + { 190344, true }, + { 190359, true }, { 190380, true }, - { 190389, true }, { 190400, true }, { 190415, true }, - { 190424, true }, - { 190442, true }, - { 190453, true }, - { 190463, true }, - { 190472, true }, - { 190483, true }, - { 190493, true }, - { 190502, true }, - { 190512, true }, - { 190525, true }, - { 190536, true }, - { 190546, true }, - { 190555, true }, + { 190430, true }, + { 190445, true }, + { 190460, true }, + { 190474, true }, + { 190488, true }, + { 190497, true }, + { 190508, true }, + { 190523, true }, + { 190532, true }, + { 190550, true }, + { 190561, true }, { 190571, true }, - { 190578, true }, - { 190589, true }, - { 190600, true }, - { 190611, true }, - { 190625, true }, - { 190636, true }, + { 190580, true }, + { 190591, true }, + { 190601, true }, + { 190610, true }, + { 190620, true }, + { 190633, true }, { 190644, true }, - { 190662, true }, - { 190674, true }, - { 190682, true }, - { 190702, false }, - { 190718, true }, - { 190737, true }, - { 190760, true }, - { 190779, true }, - { 190796, true }, - { 190807, true }, - { 190829, true }, - { 190852, true }, - { 190865, true }, - { 190874, true }, - { 190897, true }, - { 190931, true }, - { 190947, true }, - { 190961, true }, - { 190977, true }, - { 190999, true }, - { 191012, true }, + { 190654, true }, + { 190663, true }, + { 190679, true }, + { 190686, true }, + { 190697, true }, + { 190708, true }, + { 190719, true }, + { 190733, true }, + { 190744, true }, + { 190752, true }, + { 190770, true }, + { 190782, true }, + { 190790, true }, + { 190810, false }, + { 190826, true }, + { 190845, true }, + { 190868, true }, + { 190887, true }, + { 190904, true }, + { 190915, true }, + { 190937, true }, + { 190960, true }, + { 190973, true }, + { 190982, true }, + { 191005, true }, { 191039, true }, - { 191053, true }, - { 191063, true }, - { 191081, true }, - { 191091, true }, - { 191110, true }, - { 191124, true }, - { 191138, true }, - { 191154, true }, - { 191165, true }, - { 191180, true }, - { 191191, true }, - { 191214, true }, - { 191229, true }, - { 191252, true }, - { 191261, true }, - { 191274, true }, - { 191292, true }, - { 191309, true }, - { 191319, true }, - { 191344, true }, - { 191362, true }, - { 191377, true }, - { 191387, true }, - { 191399, true }, - { 191412, false }, - { 191424, true }, - { 191441, true }, - { 191451, true }, - { 191474, true }, + { 191055, true }, + { 191069, true }, + { 191085, true }, + { 191107, true }, + { 191120, true }, + { 191147, true }, + { 191161, true }, + { 191171, true }, + { 191189, true }, + { 191199, true }, + { 191218, true }, + { 191232, true }, + { 191246, true }, + { 191262, true }, + { 191273, true }, + { 191288, true }, + { 191299, true }, + { 191322, true }, + { 191337, true }, + { 191360, true }, + { 191369, true }, + { 191382, true }, + { 191400, true }, + { 191417, true }, + { 191427, true }, + { 191452, true }, + { 191470, true }, + { 191485, true }, { 191495, true }, - { 191517, true }, - { 191535, true }, - { 191546, true }, - { 191560, true }, - { 191573, true }, - { 191590, true }, - { 191598, true }, - { 191606, true }, - { 191617, true }, - { 191629, true }, + { 191507, true }, + { 191520, false }, + { 191532, true }, + { 191549, true }, + { 191559, true }, + { 191582, true }, + { 191603, true }, + { 191625, true }, { 191643, true }, - { 191656, true }, - { 191667, true }, - { 191677, true }, - { 191691, true }, + { 191654, true }, + { 191668, true }, + { 191681, true }, + { 191698, true }, { 191706, true }, - { 191716, true }, - { 191727, true }, - { 191740, true }, - { 191749, true }, - { 191758, true }, - { 191774, false }, - { 191787, false }, + { 191714, true }, + { 191725, true }, + { 191737, true }, + { 191751, true }, + { 191764, true }, + { 191775, true }, + { 191785, true }, { 191799, true }, - { 191815, true }, - { 191829, true }, - { 191846, true }, + { 191814, true }, + { 191824, true }, + { 191835, true }, + { 191848, true }, { 191857, true }, - { 191872, true }, - { 191882, true }, - { 191894, true }, - { 191912, true }, - { 191926, true }, - { 191939, true }, - { 191957, true }, - { 191966, true }, - { 191977, true }, - { 191989, true }, - { 192002, true }, - { 192014, true }, - { 192023, true }, - { 192034, true }, - { 192051, true }, - { 192067, true }, - { 192079, true }, - { 192091, true }, - { 192103, true }, - { 192120, true }, - { 192132, true }, - { 192142, true }, - { 192155, true }, + { 191866, true }, + { 191882, false }, + { 191895, true }, + { 191911, true }, + { 191925, true }, + { 191942, true }, + { 191953, true }, + { 191968, true }, + { 191978, true }, + { 191990, true }, + { 192008, true }, + { 192022, true }, + { 192035, true }, + { 192053, true }, + { 192062, true }, + { 192073, true }, + { 192085, true }, + { 192098, true }, + { 192110, true }, + { 192119, true }, + { 192130, true }, + { 192147, true }, { 192163, true }, - { 192180, true }, - { 192194, true }, - { 192209, true }, - { 192221, true }, + { 192175, true }, + { 192187, true }, + { 192199, true }, + { 192216, true }, { 192228, true }, - { 192244, true }, - { 192252, true }, - { 192261, true }, - { 192268, true }, - { 192285, true }, - { 192298, true }, - { 192313, true }, - { 192323, true }, - { 192342, true }, - { 192353, true }, - { 192372, true }, - { 192395, true }, - { 192407, false }, - { 192421, true }, - { 192437, true }, - { 192455, true }, - { 192467, true }, - { 192484, true }, - { 192495, true }, - { 192511, false }, - { 192530, true }, - { 192543, true }, - { 192558, true }, - { 192577, true }, - { 192588, true }, - { 192604, true }, - { 192625, true }, - { 192641, true }, - { 192653, true }, - { 192667, true }, - { 192681, true }, - { 192702, true }, - { 192715, true }, - { 192725, true }, - { 192746, true }, - { 192768, true }, - { 192779, true }, - { 192796, true }, + { 192238, true }, + { 192251, true }, + { 192259, true }, + { 192276, true }, + { 192290, true }, + { 192305, true }, + { 192317, true }, + { 192324, true }, + { 192340, true }, + { 192348, true }, + { 192357, true }, + { 192364, true }, + { 192381, true }, + { 192394, true }, + { 192409, true }, + { 192419, true }, + { 192438, true }, + { 192449, true }, + { 192468, true }, + { 192491, true }, + { 192503, false }, + { 192517, true }, + { 192533, true }, + { 192551, true }, + { 192563, true }, + { 192580, true }, + { 192591, true }, + { 192607, false }, + { 192626, true }, + { 192639, true }, + { 192654, true }, + { 192673, true }, + { 192684, true }, + { 192700, true }, + { 192721, true }, + { 192737, true }, + { 192749, true }, + { 192763, true }, + { 192777, true }, + { 192798, true }, { 192811, true }, - { 192831, true }, - { 192862, true }, - { 192874, true }, - { 192889, true }, - { 192908, false }, - { 192925, true }, - { 192940, true }, - { 192956, true }, - { 192968, true }, - { 192991, true }, - { 193006, true }, - { 193017, true }, - { 193025, true }, - { 193048, true }, - { 193060, true }, - { 193073, true }, - { 193081, true }, - { 193107, true }, - { 193125, true }, - { 193138, true }, - { 193155, true }, - { 193181, true }, - { 193193, true }, - { 193220, true }, + { 192821, true }, + { 192842, true }, + { 192864, true }, + { 192875, true }, + { 192892, true }, + { 192907, true }, + { 192927, true }, + { 192958, true }, + { 192970, true }, + { 192985, true }, + { 193004, false }, + { 193021, true }, + { 193036, true }, + { 193052, true }, + { 193064, true }, + { 193087, true }, + { 193102, true }, + { 193113, true }, + { 193121, true }, + { 193144, true }, + { 193156, true }, + { 193169, true }, + { 193177, true }, + { 193203, true }, + { 193221, true }, + { 193234, true }, { 193251, true }, - { 193262, true }, - { 193272, true }, - { 193287, true }, - { 193298, true }, - { 193309, true }, - { 193325, true }, - { 193337, true }, - { 193346, true }, - { 193359, true }, - { 193387, true }, - { 193408, true }, - { 193422, true }, - { 193444, true }, - { 193461, true }, - { 193471, true }, + { 193277, true }, + { 193289, true }, + { 193316, true }, + { 193347, true }, + { 193358, true }, + { 193368, true }, + { 193383, true }, + { 193394, true }, + { 193405, true }, + { 193421, true }, + { 193433, true }, + { 193442, true }, + { 193455, true }, { 193483, true }, - { 193499, true }, - { 193513, true }, - { 193524, true }, - { 193538, true }, - { 193556, true }, - { 193573, true }, - { 193593, true }, - { 193604, true }, - { 193615, false }, - { 193622, true }, - { 193632, true }, - { 193659, true }, - { 193679, true }, - { 193697, true }, - { 193712, false }, - { 193723, true }, - { 193739, true }, - { 193756, true }, - { 193773, true }, - { 193795, true }, - { 193809, true }, - { 193825, false }, - { 193842, true }, - { 193858, true }, - { 193868, true }, - { 193886, true }, - { 193900, true }, - { 193921, true }, - { 193939, true }, - { 193956, true }, - { 193974, true }, - { 193992, true }, - { 194010, true }, - { 194024, true }, - { 194034, true }, - { 194045, true }, - { 194067, true }, - { 194083, true }, - { 194105, true }, - { 194122, true }, - { 194142, true }, - { 194153, true }, - { 194172, true }, - { 194186, true }, - { 194203, true }, - { 194215, true }, - { 194232, true }, - { 194253, true }, - { 194269, true }, + { 193504, true }, + { 193518, true }, + { 193540, true }, + { 193557, true }, + { 193567, true }, + { 193579, true }, + { 193595, true }, + { 193609, true }, + { 193620, true }, + { 193634, true }, + { 193652, true }, + { 193669, true }, + { 193689, true }, + { 193700, true }, + { 193711, false }, + { 193718, true }, + { 193728, true }, + { 193755, true }, + { 193775, true }, + { 193793, true }, + { 193808, false }, + { 193819, true }, + { 193835, true }, + { 193852, true }, + { 193869, true }, + { 193891, true }, + { 193905, true }, + { 193921, false }, + { 193938, true }, + { 193954, true }, + { 193964, true }, + { 193982, true }, + { 193996, true }, + { 194017, true }, + { 194035, true }, + { 194052, true }, + { 194070, true }, + { 194088, true }, + { 194102, true }, + { 194112, true }, + { 194123, true }, + { 194145, true }, + { 194161, true }, + { 194183, true }, + { 194200, true }, + { 194220, true }, + { 194231, true }, + { 194250, true }, + { 194264, true }, { 194281, true }, - { 194304, true }, - { 194322, true }, - { 194333, true }, - { 194343, true }, + { 194293, true }, + { 194310, true }, + { 194331, true }, + { 194347, true }, { 194359, true }, - { 194370, true }, - { 194382, false }, - { 194402, true }, + { 194382, true }, + { 194400, true }, + { 194411, true }, { 194421, true }, - { 194434, true }, - { 194455, true }, - { 194465, true }, - { 194479, true }, - { 194496, true }, - { 194516, true }, - { 194530, true }, - { 194545, true }, - { 194559, true }, - { 194573, true }, - { 194591, true }, - { 194605, true }, - { 194620, true }, - { 194641, true }, - { 194652, true }, - { 194666, true }, - { 194682, true }, - { 194695, false }, - { 194709, true }, - { 194725, true }, - { 194742, true }, - { 194758, true }, - { 194781, true }, - { 194790, false }, - { 194798, true }, - { 194808, false }, - { 194830, true }, - { 194844, true }, - { 194857, true }, - { 194872, true }, - { 194886, true }, - { 194901, true }, - { 194915, true }, - { 194929, true }, - { 194942, true }, - { 194956, true }, - { 194969, true }, - { 194997, true }, - { 195009, true }, - { 195024, true }, - { 195049, true }, - { 195063, true }, - { 195084, true }, - { 195095, true }, - { 195105, true }, - { 195113, true }, - { 195131, true }, - { 195143, true }, - { 195160, true }, - { 195170, true }, - { 195188, true }, - { 195213, true }, - { 195233, true }, - { 195254, true }, - { 195274, true }, - { 195284, true }, - { 195297, false }, - { 195322, true }, - { 195343, true }, - { 195369, true }, - { 195389, true }, - { 195403, true }, - { 195420, true }, - { 195433, true }, - { 195444, true }, - { 195452, true }, - { 195461, true }, - { 195469, true }, - { 195483, true }, - { 195497, true }, - { 195510, true }, - { 195526, true }, - { 195539, true }, - { 195549, true }, - { 195560, true }, + { 194437, true }, + { 194448, true }, + { 194460, false }, + { 194480, true }, + { 194499, true }, + { 194512, true }, + { 194533, true }, + { 194543, true }, + { 194557, true }, + { 194574, true }, + { 194594, true }, + { 194608, true }, + { 194623, true }, + { 194637, true }, + { 194651, true }, + { 194669, true }, + { 194683, true }, + { 194698, true }, + { 194719, true }, + { 194730, true }, + { 194744, true }, + { 194760, true }, + { 194773, false }, + { 194787, true }, + { 194803, true }, + { 194820, true }, + { 194836, true }, + { 194859, true }, + { 194868, false }, + { 194876, true }, + { 194886, false }, + { 194908, true }, + { 194922, true }, + { 194935, true }, + { 194950, true }, + { 194964, true }, + { 194979, true }, + { 194993, true }, + { 195007, true }, + { 195020, true }, + { 195034, true }, + { 195047, true }, + { 195075, true }, + { 195087, true }, + { 195102, true }, + { 195127, true }, + { 195141, true }, + { 195162, true }, + { 195173, true }, + { 195183, true }, + { 195191, true }, + { 195209, true }, + { 195221, true }, + { 195238, true }, + { 195248, true }, + { 195266, true }, + { 195291, true }, + { 195311, true }, + { 195332, true }, + { 195352, true }, + { 195362, true }, + { 195375, false }, + { 195400, true }, + { 195421, true }, + { 195447, true }, + { 195467, true }, + { 195481, true }, + { 195494, true }, + { 195505, true }, + { 195513, true }, + { 195522, true }, + { 195530, true }, + { 195544, true }, + { 195558, true }, { 195571, true }, - { 195589, true }, - { 195605, true }, - { 195615, false }, - { 195627, true }, - { 195639, true }, - { 195657, true }, - { 195678, true }, - { 195702, true }, - { 195714, true }, - { 195724, true }, - { 195740, true }, - { 195764, true }, - { 195771, true }, - { 195787, true }, - { 195804, true }, - { 195818, true }, - { 195830, true }, - { 195842, true }, - { 195855, true }, - { 195867, true }, - { 195877, true }, + { 195587, true }, + { 195600, true }, + { 195610, true }, + { 195621, true }, + { 195632, true }, + { 195650, true }, + { 195666, true }, + { 195676, false }, + { 195688, true }, + { 195700, true }, + { 195718, true }, + { 195739, true }, + { 195763, true }, + { 195775, true }, + { 195785, true }, + { 195801, true }, + { 195825, true }, + { 195832, true }, + { 195848, true }, + { 195865, true }, + { 195879, true }, { 195891, true }, - { 195900, true }, - { 195921, true }, - { 195934, true }, - { 195951, true }, - { 195966, true }, - { 195991, true }, - { 196017, true }, - { 196032, true }, - { 196042, true }, - { 196053, true }, - { 196062, true }, - { 196084, true }, + { 195903, true }, + { 195916, true }, + { 195928, true }, + { 195938, true }, + { 195952, true }, + { 195961, true }, + { 195982, true }, + { 195995, true }, + { 196012, true }, + { 196027, true }, + { 196052, true }, + { 196078, true }, { 196093, true }, - { 196108, true }, - { 196118, true }, - { 196134, true }, - { 196147, true }, - { 196159, true }, - { 196176, true }, - { 196197, true }, - { 196218, true }, - { 196235, true }, - { 196251, true }, - { 196270, true }, - { 196282, true }, + { 196103, true }, + { 196114, true }, + { 196123, true }, + { 196145, true }, + { 196154, true }, + { 196169, true }, + { 196179, true }, + { 196195, true }, + { 196208, true }, + { 196220, true }, + { 196237, true }, + { 196258, true }, + { 196279, true }, { 196296, true }, - { 196311, true }, - { 196327, true }, - { 196341, true }, - { 196353, true }, - { 196367, true }, - { 196379, true }, - { 196398, true }, + { 196312, true }, + { 196331, true }, + { 196343, true }, + { 196357, true }, + { 196372, true }, + { 196388, true }, + { 196402, true }, { 196414, true }, - { 196430, true }, - { 196446, true }, - { 196464, true }, - { 196483, true }, - { 196493, true }, - { 196510, true }, - { 196527, true }, - { 196545, true }, - { 196563, true }, - { 196578, true }, - { 196594, true }, - { 196608, true }, - { 196626, true }, - { 196643, true }, - { 196656, true }, - { 196675, true }, - { 196695, true }, - { 196712, true }, - { 196728, true }, - { 196746, true }, - { 196759, true }, - { 196776, false }, - { 196793, false }, - { 196814, true }, - { 196831, true }, - { 196841, true }, - { 196860, true }, - { 196874, true }, - { 196887, true }, - { 196895, true }, - { 196906, true }, + { 196428, true }, + { 196440, true }, + { 196459, true }, + { 196475, true }, + { 196491, true }, + { 196507, true }, + { 196525, true }, + { 196544, true }, + { 196554, true }, + { 196571, true }, + { 196588, true }, + { 196606, true }, + { 196624, true }, + { 196639, true }, + { 196655, true }, + { 196669, true }, + { 196687, true }, + { 196704, true }, + { 196717, true }, + { 196736, true }, + { 196756, true }, + { 196773, true }, + { 196789, true }, + { 196807, true }, + { 196820, true }, + { 196837, false }, + { 196854, false }, + { 196875, true }, + { 196892, true }, + { 196902, true }, { 196921, true }, - { 196934, true }, - { 196945, true }, - { 196963, true }, - { 196975, true }, - { 196988, true }, - { 197012, true }, - { 197021, true }, + { 196935, true }, + { 196948, true }, + { 196956, true }, + { 196967, true }, + { 196982, true }, + { 196995, true }, + { 197006, true }, + { 197024, true }, { 197036, true }, - { 197060, true }, - { 197087, true }, - { 197105, true }, - { 197117, true }, - { 197126, true }, - { 197137, true }, - { 197146, true }, - { 197169, true }, - { 197182, true }, - { 197190, true }, + { 197049, true }, + { 197073, true }, + { 197082, true }, + { 197097, true }, + { 197121, true }, + { 197148, true }, + { 197166, true }, + { 197178, true }, + { 197187, true }, { 197198, true }, - { 197206, true }, - { 197216, true }, - { 197223, true }, - { 197242, true }, - { 197249, true }, - { 197264, true }, - { 197273, true }, - { 197285, false }, - { 197305, true }, - { 197315, true }, - { 197326, true }, - { 197343, true }, - { 197359, true }, - { 197378, true }, - { 197396, true }, - { 197413, true }, - { 197435, false }, - { 197448, true }, - { 197473, true }, - { 197492, true }, - { 197504, true }, - { 197515, true }, - { 197528, true }, - { 197547, true }, - { 197562, true }, - { 197577, true }, - { 197593, true }, - { 197616, true }, - { 197636, true }, - { 197649, true }, - { 197662, true }, - { 197676, true }, - { 197690, true }, - { 197701, true }, - { 197712, true }, - { 197722, true }, - { 197742, true }, - { 197761, true }, + { 197207, true }, + { 197230, true }, + { 197243, true }, + { 197251, true }, + { 197259, true }, + { 197267, true }, + { 197277, true }, + { 197284, true }, + { 197303, true }, + { 197310, true }, + { 197325, true }, + { 197334, true }, + { 197346, false }, + { 197366, true }, + { 197376, true }, + { 197387, true }, + { 197404, true }, + { 197420, true }, + { 197439, true }, + { 197457, true }, + { 197474, true }, + { 197496, false }, + { 197509, true }, + { 197534, true }, + { 197553, true }, + { 197565, true }, + { 197576, true }, + { 197589, true }, + { 197608, true }, + { 197623, true }, + { 197638, true }, + { 197654, true }, + { 197677, true }, + { 197697, true }, + { 197710, true }, + { 197723, true }, + { 197737, true }, + { 197751, true }, + { 197762, true }, { 197773, true }, - { 197790, true }, - { 197808, true }, - { 197817, true }, - { 197829, true }, - { 197844, true }, - { 197863, true }, - { 197874, true }, - { 197898, true }, - { 197920, true }, - { 197930, true }, - { 197942, true }, + { 197783, true }, + { 197803, true }, + { 197822, true }, + { 197834, true }, + { 197851, true }, + { 197869, true }, + { 197878, true }, + { 197890, true }, + { 197907, true }, + { 197922, true }, + { 197941, true }, { 197952, true }, - { 197969, true }, - { 197979, true }, - { 197993, true }, - { 198009, true }, - { 198040, true }, - { 198049, true }, - { 198063, true }, - { 198076, true }, - { 198093, true }, - { 198110, true }, - { 198122, true }, - { 198138, true }, - { 198155, true }, - { 198168, true }, - { 198181, true }, - { 198191, true }, - { 198205, true }, - { 198219, true }, - { 198228, true }, - { 198238, true }, - { 198253, true }, - { 198263, true }, - { 198277, true }, - { 198293, true }, - { 198310, true }, - { 198323, true }, - { 198337, true }, - { 198347, true }, - { 198365, true }, - { 198382, true }, - { 198398, true }, + { 197976, true }, + { 197998, true }, + { 198008, true }, + { 198020, true }, + { 198030, true }, + { 198047, true }, + { 198057, true }, + { 198071, true }, + { 198087, true }, + { 198118, true }, + { 198127, true }, + { 198141, true }, + { 198154, true }, + { 198171, true }, + { 198188, true }, + { 198200, true }, + { 198216, true }, + { 198233, true }, + { 198246, true }, + { 198259, true }, + { 198269, true }, + { 198283, true }, + { 198297, true }, + { 198306, true }, + { 198316, true }, + { 198331, true }, + { 198341, true }, + { 198355, true }, + { 198371, true }, + { 198388, true }, + { 198401, true }, { 198415, true }, - { 198437, true }, - { 198459, true }, - { 198470, true }, - { 198482, true }, - { 198500, true }, - { 198514, true }, - { 198527, true }, - { 198540, true }, - { 198559, true }, - { 198579, true }, - { 198591, true }, - { 198598, true }, - { 198610, true }, - { 198620, true }, - { 198632, true }, - { 198643, true }, - { 198658, true }, - { 198670, true }, - { 198682, true }, - { 198701, true }, - { 198727, true }, + { 198425, true }, + { 198443, true }, + { 198460, true }, + { 198476, true }, + { 198493, true }, + { 198515, true }, + { 198537, true }, + { 198548, true }, + { 198560, true }, + { 198578, true }, + { 198592, true }, + { 198605, true }, + { 198618, true }, + { 198637, true }, + { 198657, true }, + { 198669, true }, + { 198676, true }, + { 198688, true }, + { 198698, true }, + { 198710, true }, + { 198721, true }, { 198736, true }, - { 198751, true }, - { 198765, true }, - { 198781, true }, - { 198796, true }, - { 198818, true }, - { 198831, true }, - { 198845, true }, - { 198870, true }, - { 198886, true }, - { 198904, true }, - { 198918, true }, - { 198928, true }, - { 198939, true }, - { 198954, true }, + { 198748, true }, + { 198760, true }, + { 198779, true }, + { 198805, true }, + { 198814, true }, + { 198829, true }, + { 198843, true }, + { 198859, true }, + { 198874, true }, + { 198896, true }, + { 198909, true }, + { 198923, true }, + { 198948, true }, { 198964, true }, - { 198977, true }, - { 198989, true }, - { 199007, true }, - { 199023, true }, - { 199038, true }, - { 199047, true }, - { 199062, false }, + { 198982, true }, + { 198996, true }, + { 199006, true }, + { 199017, true }, + { 199032, true }, + { 199042, true }, + { 199055, true }, + { 199067, true }, { 199085, true }, { 199101, true }, - { 199114, true }, + { 199116, true }, { 199125, true }, - { 199135, true }, - { 199151, true }, - { 199168, true }, - { 199188, true }, - { 199200, true }, - { 199231, true }, - { 199252, true }, - { 199277, true }, - { 199298, true }, + { 199140, false }, + { 199163, true }, + { 199179, true }, + { 199192, true }, + { 199203, true }, + { 199213, true }, + { 199229, true }, + { 199246, true }, + { 199266, true }, + { 199278, true }, { 199309, true }, - { 199326, true }, - { 199337, true }, - { 199349, true }, - { 199364, true }, + { 199330, true }, + { 199355, true }, { 199376, true }, - { 199389, true }, - { 199409, true }, - { 199417, true }, - { 199428, true }, - { 199437, true }, - { 199446, true }, - { 199453, true }, - { 199461, true }, - { 199475, true }, - { 199486, true }, - { 199498, false }, - { 199505, true }, - { 199517, true }, + { 199387, true }, + { 199404, true }, + { 199415, true }, + { 199427, true }, + { 199442, true }, + { 199454, true }, + { 199467, true }, + { 199487, true }, + { 199495, true }, + { 199506, true }, + { 199515, true }, { 199524, true }, - { 199532, true }, - { 199545, false }, - { 199554, true }, - { 199563, true }, - { 199574, true }, - { 199581, true }, - { 199598, true }, - { 199607, true }, - { 199615, true }, - { 199629, true }, - { 199648, false }, - { 199668, true }, - { 199678, true }, - { 199699, true }, - { 199708, true }, - { 199719, false }, - { 199731, true }, - { 199745, true }, - { 199762, true }, - { 199779, true }, - { 199790, true }, - { 199819, false }, - { 199831, true }, - { 199844, true }, - { 199865, true }, - { 199879, true }, - { 199891, true }, - { 199905, true }, - { 199913, true }, - { 199930, true }, - { 199942, true }, + { 199531, true }, + { 199539, true }, + { 199553, true }, + { 199564, true }, + { 199576, false }, + { 199583, true }, + { 199595, true }, + { 199602, true }, + { 199610, true }, + { 199623, false }, + { 199632, true }, + { 199641, true }, + { 199652, true }, + { 199659, true }, + { 199676, true }, + { 199685, true }, + { 199693, true }, + { 199707, true }, + { 199726, false }, + { 199746, true }, + { 199756, true }, + { 199777, true }, + { 199786, true }, + { 199797, false }, + { 199809, true }, + { 199823, true }, + { 199840, true }, + { 199857, true }, + { 199868, true }, + { 199897, false }, + { 199909, true }, + { 199922, true }, + { 199943, true }, { 199957, true }, - { 199971, true }, - { 199979, true }, - { 199987, true }, - { 199999, true }, - { 200007, true }, + { 199969, true }, + { 199983, true }, + { 199991, true }, + { 200008, true }, { 200020, true }, - { 200032, true }, - { 200046, true }, - { 200063, true }, - { 200081, true }, - { 200094, true }, - { 200104, true }, - { 200113, true }, - { 200123, true }, - { 200135, false }, - { 200147, true }, - { 200160, true }, - { 200173, true }, + { 200035, true }, + { 200049, true }, + { 200057, true }, + { 200065, true }, + { 200077, true }, + { 200085, true }, + { 200098, true }, + { 200110, true }, + { 200124, true }, + { 200141, true }, + { 200159, true }, + { 200172, true }, { 200182, true }, - { 200205, true }, - { 200219, true }, - { 200227, true }, - { 200240, true }, - { 200256, true }, - { 200273, true }, - { 200286, true }, - { 200304, true }, - { 200316, true }, - { 200327, true }, - { 200346, true }, - { 200368, true }, - { 200390, true }, - { 200410, true }, - { 200428, false }, - { 200444, true }, - { 200467, true }, - { 200476, true }, - { 200484, true }, - { 200499, true }, - { 200518, true }, - { 200534, true }, - { 200548, true }, - { 200564, true }, - { 200584, false }, - { 200609, true }, - { 200619, true }, - { 200637, true }, - { 200644, true }, - { 200656, true }, - { 200669, true }, - { 200679, true }, - { 200695, true }, - { 200703, true }, - { 200711, true }, - { 200719, true }, - { 200726, false }, - { 200749, true }, - { 200768, true }, - { 200793, true }, - { 200810, true }, - { 200822, true }, - { 200834, true }, - { 200844, true }, - { 200855, true }, - { 200870, true }, - { 200879, true }, - { 200893, true }, - { 200902, true }, - { 200917, true }, - { 200928, true }, - { 200941, true }, - { 200963, true }, - { 200975, true }, - { 200985, true }, + { 200191, true }, + { 200201, true }, + { 200213, false }, + { 200225, true }, + { 200238, true }, + { 200251, true }, + { 200260, true }, + { 200283, true }, + { 200297, true }, + { 200305, true }, + { 200318, true }, + { 200334, true }, + { 200351, true }, + { 200364, true }, + { 200382, true }, + { 200394, true }, + { 200405, true }, + { 200424, true }, + { 200446, true }, + { 200468, true }, + { 200488, true }, + { 200506, false }, + { 200522, true }, + { 200545, true }, + { 200554, true }, + { 200562, true }, + { 200577, true }, + { 200596, true }, + { 200612, true }, + { 200626, true }, + { 200642, true }, + { 200662, false }, + { 200687, true }, + { 200697, true }, + { 200715, true }, + { 200722, true }, + { 200734, true }, + { 200747, true }, + { 200757, true }, + { 200773, true }, + { 200781, true }, + { 200789, true }, + { 200797, true }, + { 200804, false }, + { 200827, true }, + { 200846, true }, + { 200871, true }, + { 200888, true }, + { 200900, true }, + { 200912, true }, + { 200922, true }, + { 200933, true }, + { 200948, true }, + { 200957, true }, + { 200971, true }, + { 200980, true }, + { 200995, true }, { 201006, true }, - { 201023, true }, - { 201044, true }, - { 201058, true }, - { 201074, true }, - { 201087, true }, - { 201099, true }, - { 201114, true }, - { 201124, true }, - { 201137, true }, - { 201161, true }, - { 201180, true }, + { 201019, true }, + { 201041, true }, + { 201053, true }, + { 201063, true }, + { 201084, true }, + { 201101, true }, + { 201122, true }, + { 201136, true }, + { 201152, true }, + { 201165, true }, + { 201177, true }, { 201192, true }, - { 201210, true }, - { 201219, false }, - { 201236, true }, - { 201254, true }, - { 201268, true }, - { 201281, true }, - { 201294, false }, - { 201315, true }, - { 201325, true }, - { 201344, true }, - { 201357, true }, - { 201377, true }, - { 201402, true }, - { 201413, true }, - { 201425, true }, - { 201440, true }, - { 201453, true }, - { 201468, true }, - { 201483, true }, + { 201202, true }, + { 201215, true }, + { 201239, true }, + { 201258, true }, + { 201270, true }, + { 201288, true }, + { 201297, false }, + { 201314, true }, + { 201332, true }, + { 201346, true }, + { 201359, true }, + { 201372, false }, + { 201393, true }, + { 201403, true }, + { 201422, true }, + { 201435, true }, + { 201455, true }, + { 201480, true }, + { 201491, true }, { 201503, true }, - { 201516, true }, - { 201544, true }, - { 201561, false }, - { 201570, true }, - { 201589, true }, - { 201606, false }, - { 201621, true }, - { 201631, true }, - { 201644, true }, - { 201660, true }, - { 201676, true }, - { 201694, true }, - { 201704, true }, - { 201717, true }, - { 201729, true }, - { 201742, true }, - { 201755, true }, - { 201764, true }, - { 201788, true }, - { 201812, false }, - { 201825, true }, - { 201836, true }, - { 201852, true }, - { 201864, true }, - { 201880, true }, - { 201897, true }, - { 201914, false }, - { 201926, true }, - { 201943, true }, - { 201962, false }, - { 201971, true }, - { 201993, true }, - { 202006, false }, + { 201518, true }, + { 201531, true }, + { 201546, true }, + { 201561, true }, + { 201581, true }, + { 201594, true }, + { 201622, true }, + { 201639, false }, + { 201648, true }, + { 201667, true }, + { 201684, false }, + { 201699, true }, + { 201709, true }, + { 201722, true }, + { 201738, true }, + { 201754, true }, + { 201772, true }, + { 201782, true }, + { 201795, true }, + { 201807, true }, + { 201820, true }, + { 201833, true }, + { 201842, true }, + { 201866, true }, + { 201890, false }, + { 201903, true }, + { 201914, true }, + { 201930, true }, + { 201942, true }, + { 201958, true }, + { 201975, true }, + { 201992, false }, + { 202004, true }, { 202021, true }, - { 202043, true }, - { 202058, true }, - { 202070, true }, - { 202089, false }, - { 202112, true }, - { 202128, true }, - { 202144, true }, - { 202162, true }, - { 202180, false }, - { 202200, true }, - { 202212, true }, - { 202225, true }, - { 202241, true }, - { 202252, true }, - { 202271, true }, - { 202282, true }, - { 202292, true }, - { 202309, true }, - { 202321, true }, - { 202333, true }, - { 202352, true }, - { 202364, true }, - { 202381, true }, - { 202402, true }, - { 202413, true }, - { 202432, true }, - { 202453, true }, - { 202463, true }, - { 202472, true }, - { 202485, true }, - { 202493, true }, - { 202509, true }, - { 202533, false }, - { 202551, true }, - { 202569, false }, - { 202589, true }, - { 202605, true }, - { 202623, true }, - { 202635, true }, - { 202652, true }, - { 202675, true }, - { 202694, true }, - { 202714, true }, - { 202727, true }, - { 202739, true }, - { 202749, true }, - { 202757, true }, - { 202779, true }, - { 202799, true }, - { 202807, true }, - { 202821, true }, - { 202837, true }, - { 202847, true }, - { 202861, true }, - { 202873, true }, - { 202882, true }, - { 202891, true }, - { 202908, true }, - { 202918, true }, + { 202040, false }, + { 202049, true }, + { 202071, true }, + { 202084, false }, + { 202099, true }, + { 202121, true }, + { 202136, true }, + { 202148, true }, + { 202167, false }, + { 202190, true }, + { 202206, true }, + { 202222, true }, + { 202240, true }, + { 202258, false }, + { 202278, true }, + { 202290, true }, + { 202303, true }, + { 202319, true }, + { 202330, true }, + { 202349, true }, + { 202360, true }, + { 202370, true }, + { 202387, true }, + { 202399, true }, + { 202411, true }, + { 202430, true }, + { 202442, true }, + { 202459, true }, + { 202480, true }, + { 202491, true }, + { 202510, true }, + { 202531, true }, + { 202541, true }, + { 202550, true }, + { 202563, true }, + { 202571, true }, + { 202587, true }, + { 202611, false }, + { 202629, true }, + { 202647, false }, + { 202667, true }, + { 202683, true }, + { 202701, true }, + { 202713, true }, + { 202730, true }, + { 202753, true }, + { 202772, true }, + { 202792, true }, + { 202805, true }, + { 202817, true }, + { 202827, true }, + { 202835, true }, + { 202857, true }, + { 202877, true }, + { 202885, true }, + { 202899, true }, + { 202915, true }, + { 202925, true }, { 202939, true }, - { 202952, true }, + { 202951, true }, + { 202960, true }, { 202969, true }, - { 202990, true }, - { 203008, true }, - { 203019, true }, - { 203037, true }, - { 203053, true }, - { 203066, true }, - { 203076, true }, - { 203093, true }, - { 203110, true }, - { 203119, true }, - { 203133, true }, - { 203147, true }, - { 203159, true }, - { 203178, true }, + { 202986, true }, + { 202996, true }, + { 203017, true }, + { 203030, true }, + { 203047, true }, + { 203068, true }, + { 203086, true }, + { 203097, true }, + { 203115, true }, + { 203131, true }, + { 203144, true }, + { 203154, true }, + { 203171, true }, { 203188, true }, - { 203205, true }, - { 203227, true }, - { 203249, true }, - { 203263, true }, - { 203277, true }, - { 203295, true }, - { 203310, true }, - { 203324, true }, - { 203331, true }, - { 203340, true }, - { 203352, true }, - { 203358, true }, - { 203364, true }, - { 203372, true }, - { 203384, true }, - { 203405, true }, - { 203417, true }, - { 203427, true }, - { 203438, true }, + { 203197, true }, + { 203211, true }, + { 203225, true }, + { 203237, true }, + { 203256, true }, + { 203266, true }, + { 203283, true }, + { 203305, true }, + { 203327, true }, + { 203341, true }, + { 203355, true }, + { 203373, true }, + { 203388, true }, + { 203402, true }, + { 203409, true }, + { 203418, true }, + { 203430, true }, + { 203436, true }, + { 203442, true }, { 203450, true }, - { 203468, true }, - { 203481, true }, - { 203500, true }, + { 203462, true }, + { 203483, true }, + { 203495, true }, + { 203505, true }, { 203516, true }, - { 203529, true }, - { 203540, true }, - { 203553, true }, - { 203571, true }, - { 203585, true }, - { 203607, false }, - { 203621, true }, - { 203640, true }, - { 203656, true }, - { 203667, true }, - { 203677, true }, - { 203685, true }, - { 203702, true }, - { 203716, true }, - { 203728, true }, + { 203528, true }, + { 203546, true }, + { 203559, true }, + { 203578, true }, + { 203594, true }, + { 203607, true }, + { 203618, true }, + { 203631, true }, + { 203649, true }, + { 203663, true }, + { 203685, false }, + { 203699, true }, + { 203718, true }, + { 203734, true }, { 203745, true }, - { 203759, true }, - { 203773, false }, - { 203786, true }, - { 203804, true }, - { 203816, true }, - { 203828, true }, - { 203847, true }, - { 203866, true }, - { 203883, true }, - { 203896, true }, - { 203910, true }, - { 203922, true }, - { 203935, true }, - { 203951, true }, - { 203964, true }, - { 203977, true }, - { 203992, true }, - { 204020, true }, - { 204030, true }, - { 204041, true }, - { 204054, true }, - { 204069, true }, - { 204082, true }, - { 204094, true }, + { 203755, true }, + { 203763, true }, + { 203780, true }, + { 203794, true }, + { 203806, true }, + { 203823, true }, + { 203837, true }, + { 203851, false }, + { 203864, true }, + { 203882, true }, + { 203894, true }, + { 203906, true }, + { 203925, true }, + { 203944, true }, + { 203961, true }, + { 203974, true }, + { 203988, true }, + { 204000, true }, + { 204013, true }, + { 204029, true }, + { 204042, true }, + { 204055, true }, + { 204070, true }, + { 204098, true }, { 204108, true }, - { 204122, true }, - { 204138, true }, - { 204161, true }, - { 204177, true }, - { 204192, true }, + { 204119, true }, + { 204132, true }, + { 204147, true }, + { 204160, true }, + { 204172, true }, + { 204186, true }, + { 204200, true }, { 204216, true }, - { 204231, true }, - { 204243, true }, - { 204265, true }, - { 204284, true }, - { 204302, true }, - { 204315, true }, - { 204332, true }, + { 204239, true }, + { 204255, true }, + { 204270, true }, + { 204294, true }, + { 204309, true }, + { 204321, true }, { 204343, true }, - { 204363, true }, - { 204375, true }, - { 204387, true }, - { 204405, true }, - { 204422, true }, - { 204437, true }, - { 204456, true }, - { 204469, true }, - { 204485, true }, - { 204503, true }, - { 204519, true }, - { 204532, true }, - { 204552, true }, - { 204565, true }, - { 204587, true }, - { 204604, true }, - { 204619, true }, - { 204635, true }, - { 204656, true }, - { 204676, true }, - { 204689, true }, - { 204704, true }, - { 204716, true }, - { 204730, true }, - { 204748, true }, - { 204763, true }, + { 204362, true }, + { 204380, true }, + { 204393, true }, + { 204410, true }, + { 204421, true }, + { 204441, true }, + { 204453, true }, + { 204465, true }, + { 204483, true }, + { 204500, true }, + { 204515, true }, + { 204534, true }, + { 204547, true }, + { 204563, true }, + { 204581, true }, + { 204597, true }, + { 204610, true }, + { 204630, true }, + { 204643, true }, + { 204665, true }, + { 204682, true }, + { 204697, true }, + { 204713, true }, + { 204734, true }, + { 204754, true }, + { 204767, true }, { 204782, true }, - { 204801, true }, - { 204816, true }, - { 204828, true }, - { 204845, true }, + { 204794, true }, + { 204808, true }, + { 204826, true }, + { 204841, true }, { 204860, true }, - { 204877, true }, - { 204895, true }, - { 204915, true }, - { 204927, true }, - { 204941, true }, - { 204952, true }, - { 204964, true }, - { 204986, true }, - { 204998, true }, - { 205007, true }, + { 204879, true }, + { 204894, true }, + { 204906, true }, + { 204923, true }, + { 204938, true }, + { 204955, true }, + { 204973, true }, + { 204993, true }, + { 205005, true }, { 205019, true }, - { 205034, true }, - { 205053, true }, - { 205071, true }, - { 205090, true }, - { 205106, true }, - { 205125, true }, - { 205141, true }, - { 205158, true }, - { 205171, true }, - { 205190, true }, - { 205208, true }, - { 205214, true }, - { 205232, true }, - { 205255, true }, - { 205264, true }, - { 205272, false }, - { 205292, true }, - { 205309, true }, + { 205030, true }, + { 205042, true }, + { 205064, true }, + { 205076, true }, + { 205085, true }, + { 205097, true }, + { 205112, true }, + { 205130, true }, + { 205149, true }, + { 205165, true }, + { 205184, true }, + { 205200, true }, + { 205217, true }, + { 205230, true }, + { 205249, true }, + { 205267, true }, + { 205273, true }, + { 205291, true }, + { 205314, true }, { 205323, true }, - { 205335, true }, - { 205354, false }, - { 205371, true }, - { 205390, true }, - { 205401, true }, - { 205420, true }, - { 205437, true }, + { 205331, false }, + { 205351, true }, + { 205368, true }, + { 205382, true }, + { 205394, true }, + { 205413, false }, + { 205430, true }, + { 205449, true }, { 205460, true }, - { 205486, true }, - { 205497, true }, - { 205515, true }, - { 205535, true }, - { 205552, true }, - { 205571, true }, - { 205589, true }, - { 205607, true }, - { 205616, true }, - { 205623, true }, + { 205479, true }, + { 205496, true }, + { 205519, true }, + { 205545, true }, + { 205556, true }, + { 205574, true }, + { 205594, true }, + { 205611, true }, { 205630, true }, - { 205641, true }, - { 205653, true }, - { 205663, true }, - { 205674, false }, - { 205694, true }, - { 205702, true }, - { 205713, true }, - { 205724, true }, - { 205735, true }, - { 205758, true }, - { 205782, true }, - { 205805, true }, - { 205828, true }, - { 205856, true }, - { 205885, true }, - { 205900, true }, - { 205919, true }, - { 205932, true }, - { 205950, true }, - { 205973, true }, - { 205990, true }, - { 206001, true }, - { 206018, true }, - { 206029, true }, - { 206044, true }, - { 206057, true }, - { 206068, true }, - { 206086, true }, - { 206112, true }, - { 206141, true }, - { 206153, true }, - { 206166, false }, - { 206186, true }, - { 206201, true }, - { 206219, true }, - { 206234, true }, - { 206255, false }, - { 206271, true }, - { 206287, true }, - { 206305, true }, - { 206321, true }, - { 206337, true }, - { 206352, true }, - { 206370, true }, - { 206386, true }, - { 206398, true }, - { 206410, true }, - { 206432, true }, - { 206454, true }, - { 206474, true }, - { 206488, true }, - { 206509, true }, - { 206528, true }, - { 206548, true }, - { 206569, true }, - { 206588, true }, - { 206606, false }, - { 206624, true }, - { 206644, true }, - { 206663, true }, - { 206682, true }, - { 206698, true }, - { 206718, true }, - { 206739, true }, - { 206766, true }, - { 206778, true }, - { 206789, true }, - { 206803, true }, - { 206818, true }, - { 206829, true }, - { 206848, true }, - { 206859, true }, - { 206873, true }, - { 206884, true }, - { 206896, true }, - { 206905, true }, - { 206920, true }, - { 206930, true }, - { 206943, true }, + { 205648, true }, + { 205666, true }, + { 205675, true }, + { 205682, true }, + { 205689, true }, + { 205700, true }, + { 205712, true }, + { 205722, true }, + { 205733, false }, + { 205753, true }, + { 205761, true }, + { 205772, true }, + { 205783, true }, + { 205794, true }, + { 205817, true }, + { 205841, true }, + { 205864, true }, + { 205887, true }, + { 205915, true }, + { 205944, true }, + { 205957, true }, + { 205972, true }, + { 205991, true }, + { 206004, true }, + { 206022, true }, + { 206045, true }, + { 206062, true }, + { 206073, true }, + { 206090, true }, + { 206101, true }, + { 206116, true }, + { 206129, true }, + { 206140, true }, + { 206158, true }, + { 206184, true }, + { 206213, true }, + { 206225, true }, + { 206238, false }, + { 206258, true }, + { 206273, true }, + { 206291, true }, + { 206306, true }, + { 206327, false }, + { 206343, true }, + { 206359, true }, + { 206377, true }, + { 206393, true }, + { 206409, true }, + { 206424, true }, + { 206442, true }, + { 206458, true }, + { 206470, true }, + { 206482, true }, + { 206504, true }, + { 206526, true }, + { 206546, true }, + { 206560, true }, + { 206581, true }, + { 206600, true }, + { 206620, true }, + { 206641, true }, + { 206660, true }, + { 206677, true }, + { 206695, false }, + { 206713, true }, + { 206733, true }, + { 206752, true }, + { 206771, true }, + { 206787, true }, + { 206807, true }, + { 206828, true }, + { 206855, true }, + { 206867, true }, + { 206878, true }, + { 206892, true }, + { 206907, true }, + { 206918, true }, + { 206937, true }, + { 206948, true }, { 206962, true }, - { 206980, true }, - { 207000, true }, + { 206973, true }, + { 206985, true }, + { 206994, true }, { 207009, true }, { 207019, true }, - { 207040, false }, - { 207057, true }, - { 207077, true }, - { 207086, true }, - { 207099, true }, - { 207116, true }, - { 207139, true }, - { 207153, true }, - { 207167, true }, - { 207179, true }, - { 207196, true }, - { 207211, true }, + { 207032, true }, + { 207051, true }, + { 207069, true }, + { 207089, true }, + { 207098, true }, + { 207108, true }, + { 207129, false }, + { 207146, true }, + { 207166, true }, + { 207175, true }, + { 207188, true }, + { 207205, true }, { 207228, true }, - { 207244, true }, - { 207261, true }, - { 207277, true }, - { 207289, true }, + { 207242, true }, + { 207256, true }, + { 207268, true }, + { 207285, true }, { 207300, true }, - { 207314, false }, - { 207330, true }, - { 207341, true }, - { 207357, true }, + { 207317, true }, + { 207333, true }, + { 207350, true }, { 207366, true }, - { 207381, true }, - { 207397, true }, - { 207410, true }, + { 207378, true }, + { 207389, true }, + { 207403, false }, { 207419, true }, - { 207432, true }, - { 207449, true }, - { 207461, true }, - { 207473, true }, - { 207485, true }, - { 207497, true }, - { 207506, true }, - { 207518, true }, - { 207533, true }, - { 207547, true }, - { 207559, true }, - { 207576, true }, - { 207588, true }, - { 207598, true }, - { 207614, true }, - { 207630, true }, - { 207651, true }, - { 207669, true }, - { 207685, true }, - { 207701, true }, - { 207721, true }, - { 207736, true }, - { 207748, true }, - { 207763, true }, - { 207773, true }, - { 207788, true }, - { 207800, true }, - { 207812, true }, - { 207827, true }, - { 207841, true }, + { 207430, true }, + { 207446, true }, + { 207455, true }, + { 207470, true }, + { 207486, true }, + { 207499, true }, + { 207508, true }, + { 207521, true }, + { 207538, true }, + { 207550, true }, + { 207562, true }, + { 207574, true }, + { 207586, true }, + { 207595, true }, + { 207607, true }, + { 207622, true }, + { 207636, true }, + { 207648, true }, + { 207665, true }, + { 207677, true }, + { 207687, true }, + { 207703, true }, + { 207719, true }, + { 207740, true }, + { 207758, true }, + { 207774, true }, + { 207790, true }, + { 207810, true }, + { 207825, true }, + { 207837, true }, { 207852, true }, - { 207863, true }, - { 207874, true }, - { 207885, true }, - { 207893, true }, - { 207906, true }, - { 207920, true }, - { 207933, true }, - { 207951, true }, - { 207968, true }, - { 207978, true }, - { 207991, true }, - { 208008, true }, + { 207862, true }, + { 207877, true }, + { 207889, true }, + { 207901, true }, + { 207916, true }, + { 207930, true }, + { 207941, true }, + { 207952, true }, + { 207963, true }, + { 207974, true }, + { 207982, true }, + { 207995, true }, + { 208009, true }, { 208022, true }, - { 208031, true }, - { 208046, true }, - { 208060, true }, - { 208073, true }, - { 208087, true }, - { 208101, true }, - { 208109, true }, - { 208128, true }, - { 208148, true }, - { 208165, true }, - { 208180, true }, - { 208195, true }, - { 208209, true }, - { 208227, true }, - { 208243, true }, - { 208259, true }, - { 208273, true }, - { 208289, true }, - { 208311, true }, - { 208328, true }, - { 208347, true }, - { 208360, true }, - { 208374, true }, - { 208390, false }, - { 208408, true }, - { 208423, true }, - { 208440, true }, - { 208455, true }, - { 208472, false }, - { 208498, true }, - { 208513, true }, - { 208531, true }, + { 208040, true }, + { 208057, true }, + { 208067, true }, + { 208080, true }, + { 208097, true }, + { 208111, true }, + { 208120, true }, + { 208135, true }, + { 208149, true }, + { 208162, true }, + { 208176, true }, + { 208190, true }, + { 208198, true }, + { 208217, true }, + { 208237, true }, + { 208254, true }, + { 208269, true }, + { 208284, true }, + { 208298, true }, + { 208316, true }, + { 208332, true }, + { 208348, true }, + { 208362, true }, + { 208378, true }, + { 208400, true }, + { 208417, true }, + { 208436, true }, + { 208449, true }, + { 208463, true }, + { 208479, false }, + { 208497, true }, + { 208512, true }, + { 208529, true }, { 208544, true }, - { 208557, true }, - { 208576, true }, - { 208591, true }, - { 208601, true }, - { 208617, true }, - { 208629, true }, - { 208651, true }, - { 208664, false }, - { 208675, true }, - { 208703, true }, - { 208720, true }, - { 208751, true }, - { 208761, true }, - { 208772, true }, - { 208784, true }, - { 208798, true }, - { 208810, true }, - { 208818, true }, - { 208826, true }, - { 208844, true }, - { 208855, false }, - { 208875, true }, - { 208893, true }, - { 208913, true }, - { 208928, true }, - { 208943, true }, - { 208960, false }, - { 208974, true }, + { 208561, false }, + { 208587, true }, + { 208602, true }, + { 208620, true }, + { 208633, true }, + { 208646, true }, + { 208658, true }, + { 208677, true }, + { 208692, true }, + { 208702, true }, + { 208718, true }, + { 208730, true }, + { 208752, true }, + { 208765, false }, + { 208776, true }, + { 208804, true }, + { 208821, true }, + { 208852, true }, + { 208862, true }, + { 208873, true }, + { 208885, true }, + { 208899, true }, + { 208911, true }, + { 208919, true }, + { 208927, true }, + { 208945, true }, + { 208956, false }, + { 208976, true }, { 208994, true }, - { 209005, true }, - { 209030, true }, - { 209051, true }, - { 209069, true }, - { 209084, true }, - { 209101, true }, - { 209116, true }, - { 209132, true }, - { 209151, true }, - { 209176, true }, - { 209189, true }, - { 209200, true }, - { 209211, true }, - { 209225, true }, - { 209238, false }, - { 209266, true }, - { 209278, true }, - { 209291, true }, - { 209304, false }, + { 209014, true }, + { 209029, true }, + { 209044, true }, + { 209061, false }, + { 209075, true }, + { 209095, true }, + { 209106, true }, + { 209131, true }, + { 209152, true }, + { 209170, true }, + { 209185, true }, + { 209202, true }, + { 209217, true }, + { 209233, true }, + { 209252, true }, + { 209277, true }, + { 209290, true }, + { 209301, true }, { 209312, true }, - { 209322, true }, - { 209338, true }, - { 209353, true }, - { 209371, true }, - { 209383, true }, - { 209402, true }, - { 209414, true }, - { 209427, true }, - { 209440, true }, - { 209455, true }, - { 209477, true }, - { 209491, true }, - { 209504, true }, - { 209519, true }, - { 209533, true }, - { 209546, true }, - { 209566, false }, - { 209583, true }, - { 209601, true }, - { 209615, true }, - { 209628, true }, - { 209642, true }, - { 209653, true }, - { 209664, true }, - { 209677, true }, - { 209687, true }, - { 209704, true }, - { 209712, true }, - { 209727, true }, - { 209740, true }, - { 209754, true }, - { 209769, true }, - { 209794, true }, - { 209830, true }, - { 209843, true }, - { 209858, true }, - { 209871, true }, - { 209888, true }, - { 209910, true }, - { 209932, true }, - { 209950, true }, - { 209963, true }, - { 209974, true }, - { 209986, true }, - { 209997, true }, - { 210015, true }, - { 210023, true }, - { 210056, true }, - { 210063, true }, - { 210080, true }, - { 210096, true }, - { 210113, true }, - { 210123, true }, - { 210136, true }, - { 210150, true }, - { 210160, false }, - { 210178, true }, - { 210196, true }, - { 210208, true }, - { 210220, true }, - { 210231, true }, - { 210244, true }, - { 210257, true }, - { 210273, true }, - { 210290, true }, - { 210304, true }, - { 210318, true }, - { 210338, true }, - { 210352, true }, - { 210364, true }, - { 210384, true }, - { 210403, true }, - { 210416, true }, - { 210436, true }, - { 210447, true }, - { 210464, true }, - { 210474, true }, - { 210483, true }, - { 210495, true }, + { 209326, true }, + { 209339, false }, + { 209367, true }, + { 209379, true }, + { 209392, true }, + { 209405, false }, + { 209413, true }, + { 209423, true }, + { 209439, true }, + { 209454, true }, + { 209472, true }, + { 209484, true }, + { 209503, true }, + { 209515, true }, + { 209528, true }, + { 209541, true }, + { 209556, true }, + { 209569, true }, + { 209591, true }, + { 209605, true }, + { 209618, true }, + { 209633, true }, + { 209647, true }, + { 209660, true }, + { 209680, false }, + { 209697, true }, + { 209715, true }, + { 209729, true }, + { 209742, true }, + { 209756, true }, + { 209767, true }, + { 209778, true }, + { 209791, true }, + { 209801, true }, + { 209818, true }, + { 209826, true }, + { 209841, true }, + { 209854, true }, + { 209868, true }, + { 209883, true }, + { 209908, true }, + { 209944, true }, + { 209957, true }, + { 209972, true }, + { 209985, true }, + { 210002, true }, + { 210024, true }, + { 210046, true }, + { 210064, true }, + { 210077, true }, + { 210088, true }, + { 210100, true }, + { 210111, true }, + { 210129, true }, + { 210137, true }, + { 210170, true }, + { 210177, true }, + { 210194, true }, + { 210210, true }, + { 210227, true }, + { 210237, true }, + { 210250, true }, + { 210264, true }, + { 210274, false }, + { 210292, true }, + { 210310, true }, + { 210322, true }, + { 210334, true }, + { 210345, true }, + { 210358, true }, + { 210371, true }, + { 210387, true }, + { 210404, true }, + { 210418, true }, + { 210432, true }, + { 210452, true }, + { 210466, true }, + { 210478, true }, + { 210498, true }, { 210517, true }, - { 210528, true }, - { 210542, true }, + { 210530, true }, + { 210550, true }, { 210561, true }, { 210578, true }, - { 210595, true }, + { 210588, true }, + { 210597, true }, { 210609, true }, - { 210623, true }, - { 210637, true }, - { 210660, true }, - { 210680, true }, - { 210694, true }, - { 210708, true }, - { 210722, true }, - { 210734, true }, - { 210746, true }, - { 210762, true }, - { 210772, true }, - { 210786, true }, - { 210796, true }, - { 210810, true }, - { 210819, true }, - { 210831, true }, - { 210842, true }, - { 210853, true }, - { 210865, true }, + { 210631, true }, + { 210642, true }, + { 210656, true }, + { 210675, true }, + { 210692, true }, + { 210709, true }, + { 210723, true }, + { 210737, true }, + { 210751, true }, + { 210774, true }, + { 210794, true }, + { 210808, true }, + { 210822, true }, + { 210836, true }, + { 210848, true }, + { 210864, true }, { 210874, true }, - { 210883, true }, - { 210894, true }, - { 210908, true }, - { 210920, true }, + { 210888, true }, + { 210898, true }, + { 210912, true }, + { 210921, true }, { 210933, true }, - { 210948, false }, - { 210975, true }, + { 210944, true }, + { 210955, true }, + { 210967, true }, + { 210976, true }, { 210985, true }, - { 210998, true }, - { 211011, true }, - { 211027, true }, - { 211048, true }, - { 211069, true }, - { 211088, true }, - { 211098, true }, - { 211110, true }, - { 211121, true }, - { 211144, false }, - { 211152, true }, - { 211167, true }, - { 211181, true }, - { 211195, true }, - { 211207, true }, - { 211220, true }, - { 211230, true }, - { 211238, true }, - { 211259, true }, - { 211271, true }, - { 211282, true }, - { 211302, true }, - { 211321, true }, + { 210996, true }, + { 211010, true }, + { 211022, true }, + { 211035, true }, + { 211050, false }, + { 211077, true }, + { 211087, true }, + { 211100, true }, + { 211113, true }, + { 211129, true }, + { 211150, true }, + { 211171, true }, + { 211190, true }, + { 211200, true }, + { 211212, true }, + { 211223, true }, + { 211246, false }, + { 211254, true }, + { 211269, true }, + { 211283, true }, + { 211297, true }, + { 211309, true }, + { 211322, true }, { 211332, true }, - { 211347, true }, - { 211372, false }, - { 211400, false }, - { 211412, true }, + { 211340, true }, + { 211361, true }, + { 211373, true }, + { 211384, true }, + { 211404, true }, { 211423, true }, - { 211439, true }, - { 211454, true }, - { 211469, true }, - { 211480, true }, - { 211497, true }, - { 211509, true }, + { 211434, true }, + { 211449, true }, + { 211474, false }, + { 211502, false }, + { 211514, true }, { 211525, true }, - { 211540, true }, - { 211555, true }, + { 211541, true }, + { 211556, true }, { 211571, true }, - { 211588, true }, + { 211582, true }, + { 211599, true }, { 211611, true }, - { 211630, true }, - { 211644, true }, - { 211665, true }, - { 211685, true }, - { 211703, true }, - { 211722, true }, - { 211740, true }, - { 211758, true }, - { 211774, true }, - { 211789, true }, - { 211801, false }, - { 211816, false }, - { 211830, true }, - { 211843, true }, - { 211859, true }, - { 211870, true }, - { 211881, true }, - { 211892, true }, - { 211903, true }, - { 211915, true }, - { 211930, true }, - { 211948, true }, - { 211966, true }, - { 211988, true }, - { 212002, true }, - { 212019, true }, - { 212038, true }, - { 212056, true }, - { 212077, true }, - { 212091, false }, - { 212103, true }, - { 212118, true }, - { 212134, true }, - { 212152, true }, - { 212162, true }, - { 212174, false }, - { 212185, true }, - { 212204, false }, - { 212223, true }, - { 212238, true }, - { 212251, false }, - { 212270, true }, - { 212281, true }, - { 212299, true }, - { 212313, true }, - { 212338, true }, - { 212353, true }, - { 212368, true }, - { 212386, true }, + { 211627, true }, + { 211642, true }, + { 211657, true }, + { 211673, true }, + { 211690, true }, + { 211713, true }, + { 211732, true }, + { 211746, true }, + { 211767, true }, + { 211787, true }, + { 211805, true }, + { 211824, true }, + { 211842, true }, + { 211860, true }, + { 211876, true }, + { 211891, true }, + { 211903, false }, + { 211918, false }, + { 211932, true }, + { 211945, true }, + { 211961, true }, + { 211972, true }, + { 211983, true }, + { 211994, true }, + { 212005, true }, + { 212017, true }, + { 212032, true }, + { 212050, true }, + { 212068, true }, + { 212090, true }, + { 212104, true }, + { 212121, true }, + { 212140, true }, + { 212158, true }, + { 212179, true }, + { 212193, false }, + { 212205, true }, + { 212220, true }, + { 212236, true }, + { 212254, true }, + { 212264, true }, + { 212276, false }, + { 212287, true }, + { 212306, false }, + { 212325, true }, + { 212340, true }, + { 212353, false }, + { 212372, true }, + { 212383, true }, { 212401, true }, - { 212416, true }, - { 212433, true }, - { 212444, true }, - { 212454, true }, - { 212466, true }, - { 212480, true }, - { 212492, true }, - { 212507, true }, - { 212516, true }, - { 212534, true }, - { 212545, true }, - { 212558, true }, - { 212573, false }, - { 212586, true }, - { 212598, true }, - { 212619, true }, - { 212632, true }, - { 212649, true }, - { 212669, true }, - { 212692, true }, - { 212711, true }, - { 212722, true }, - { 212736, true }, - { 212746, false }, - { 212758, true }, - { 212773, true }, - { 212787, true }, - { 212797, true }, - { 212811, true }, - { 212831, true }, - { 212854, true }, - { 212867, true }, - { 212885, true }, - { 212893, true }, - { 212904, true }, - { 212911, true }, - { 212919, true }, - { 212934, true }, - { 212946, true }, - { 212961, true }, - { 212978, true }, - { 212990, true }, - { 213007, true }, - { 213024, true }, - { 213035, false }, - { 213044, true }, - { 213057, false }, - { 213074, true }, - { 213087, true }, - { 213098, false }, - { 213111, true }, - { 213128, true }, - { 213143, false }, - { 213167, false }, - { 213179, true }, - { 213204, true }, + { 212415, true }, + { 212440, true }, + { 212455, true }, + { 212470, true }, + { 212488, true }, + { 212503, true }, + { 212518, true }, + { 212535, true }, + { 212546, true }, + { 212556, true }, + { 212568, true }, + { 212582, true }, + { 212594, true }, + { 212609, true }, + { 212618, true }, + { 212636, true }, + { 212647, true }, + { 212660, true }, + { 212675, false }, + { 212688, true }, + { 212700, true }, + { 212721, true }, + { 212734, true }, + { 212751, true }, + { 212771, true }, + { 212794, true }, + { 212813, true }, + { 212824, true }, + { 212838, true }, + { 212848, false }, + { 212860, true }, + { 212875, true }, + { 212889, true }, + { 212899, true }, + { 212913, true }, + { 212933, true }, + { 212956, true }, + { 212969, true }, + { 212987, true }, + { 212995, true }, + { 213006, true }, + { 213013, true }, + { 213021, true }, + { 213036, true }, + { 213048, true }, + { 213063, true }, + { 213080, true }, + { 213092, true }, + { 213109, true }, + { 213126, true }, + { 213137, false }, + { 213146, true }, + { 213159, false }, + { 213176, true }, + { 213189, true }, + { 213200, false }, { 213213, true }, - { 213225, true }, - { 213245, true }, - { 213262, true }, - { 213272, true }, + { 213230, true }, + { 213245, false }, + { 213269, false }, { 213281, true }, - { 213297, true }, - { 213316, true }, - { 213334, true }, - { 213350, true }, - { 213370, true }, + { 213306, true }, + { 213315, true }, + { 213327, true }, + { 213347, true }, + { 213364, true }, + { 213374, true }, { 213383, true }, - { 213396, true }, - { 213409, true }, + { 213399, true }, { 213418, true }, - { 213431, true }, - { 213445, true }, - { 213459, true }, - { 213482, true }, - { 213493, true }, - { 213515, true }, - { 213541, true }, - { 213556, true }, - { 213571, true }, - { 213581, true }, + { 213436, true }, + { 213452, true }, + { 213472, true }, + { 213485, true }, + { 213498, true }, + { 213511, true }, + { 213520, true }, + { 213533, true }, + { 213547, true }, + { 213561, true }, + { 213584, true }, { 213595, true }, - { 213607, true }, - { 213630, true }, - { 213639, true }, - { 213647, true }, - { 213663, true }, - { 213677, true }, - { 213689, true }, - { 213702, true }, - { 213719, false }, - { 213737, true }, - { 213761, true }, - { 213774, true }, - { 213785, true }, - { 213802, true }, - { 213815, true }, - { 213826, true }, - { 213836, true }, - { 213851, true }, - { 213864, true }, - { 213880, true }, - { 213890, false }, - { 213900, true }, - { 213913, true }, + { 213617, true }, + { 213643, true }, + { 213658, true }, + { 213673, true }, + { 213683, true }, + { 213697, true }, + { 213709, true }, + { 213732, true }, + { 213741, true }, + { 213749, true }, + { 213765, true }, + { 213779, true }, + { 213791, true }, + { 213804, true }, + { 213821, false }, + { 213839, true }, + { 213863, true }, + { 213876, true }, + { 213887, true }, + { 213904, true }, + { 213917, true }, { 213928, true }, { 213938, true }, - { 213954, true }, - { 213968, true }, - { 213980, true }, - { 213989, true }, - { 214004, true }, - { 214022, true }, - { 214031, true }, - { 214051, true }, - { 214067, true }, - { 214084, true }, - { 214097, true }, - { 214107, true }, - { 214117, true }, - { 214131, true }, - { 214143, true }, - { 214156, true }, - { 214173, true }, - { 214188, true }, - { 214205, true }, - { 214217, true }, - { 214234, true }, - { 214248, true }, - { 214257, true }, - { 214273, true }, - { 214286, true }, - { 214299, true }, - { 214314, false }, - { 214326, true }, - { 214339, true }, - { 214349, true }, - { 214358, true }, - { 214370, true }, - { 214378, true }, - { 214386, true }, - { 214394, true }, - { 214400, true }, - { 214411, true }, - { 214426, true }, - { 214439, true }, - { 214454, true }, - { 214473, true }, - { 214497, true }, - { 214510, true }, - { 214525, true }, - { 214549, true }, - { 214559, true }, - { 214571, true }, - { 214588, true }, - { 214598, true }, - { 214614, true }, - { 214635, true }, - { 214650, false }, + { 213953, true }, + { 213966, true }, + { 213982, true }, + { 213992, false }, + { 214002, true }, + { 214015, true }, + { 214030, true }, + { 214040, true }, + { 214056, true }, + { 214070, true }, + { 214082, true }, + { 214091, true }, + { 214106, true }, + { 214124, true }, + { 214133, true }, + { 214153, true }, + { 214169, true }, + { 214186, true }, + { 214199, true }, + { 214209, true }, + { 214219, true }, + { 214233, true }, + { 214245, true }, + { 214258, true }, + { 214275, true }, + { 214290, true }, + { 214307, true }, + { 214319, true }, + { 214336, true }, + { 214350, true }, + { 214359, true }, + { 214375, true }, + { 214388, true }, + { 214401, true }, + { 214416, false }, + { 214428, true }, + { 214441, true }, + { 214451, true }, + { 214460, true }, + { 214472, true }, + { 214480, true }, + { 214488, true }, + { 214496, true }, + { 214502, true }, + { 214513, true }, + { 214528, true }, + { 214541, true }, + { 214556, true }, + { 214575, true }, + { 214599, true }, + { 214612, true }, + { 214627, true }, + { 214651, true }, + { 214661, true }, { 214673, true }, - { 214694, true }, - { 214707, true }, - { 214720, true }, + { 214690, true }, + { 214700, true }, + { 214716, true }, { 214737, true }, - { 214751, true }, - { 214763, true }, - { 214782, true }, - { 214795, true }, - { 214813, true }, - { 214837, false }, - { 214864, true }, - { 214890, true }, - { 214905, true }, - { 214922, true }, - { 214938, true }, - { 214955, true }, - { 214972, true }, - { 214987, true }, - { 215000, true }, - { 215011, true }, - { 215022, true }, - { 215032, true }, - { 215045, true }, - { 215063, true }, - { 215076, true }, - { 215090, true }, - { 215100, true }, - { 215111, true }, - { 215120, true }, - { 215141, true }, - { 215155, true }, - { 215164, true }, - { 215171, true }, + { 214752, false }, + { 214775, true }, + { 214796, true }, + { 214809, true }, + { 214822, true }, + { 214839, true }, + { 214853, true }, + { 214865, true }, + { 214884, true }, + { 214897, true }, + { 214915, true }, + { 214939, false }, + { 214966, true }, + { 214992, true }, + { 215007, true }, + { 215024, true }, + { 215040, true }, + { 215057, true }, + { 215074, true }, + { 215089, true }, + { 215102, true }, + { 215113, true }, + { 215124, true }, + { 215134, true }, + { 215147, true }, + { 215165, true }, { 215178, true }, - { 215186, true }, - { 215209, true }, + { 215192, true }, + { 215202, true }, + { 215213, true }, { 215222, true }, - { 215236, true }, - { 215249, true }, - { 215264, true }, - { 215278, true }, - { 215293, true }, - { 215302, true }, - { 215310, true }, - { 215323, true }, - { 215334, true }, - { 215342, true }, - { 215360, true }, - { 215372, true }, - { 215383, true }, - { 215399, true }, - { 215408, true }, - { 215421, true }, - { 215432, true }, + { 215243, true }, + { 215257, true }, + { 215266, true }, + { 215273, true }, + { 215280, true }, + { 215288, true }, + { 215311, true }, + { 215324, true }, + { 215338, true }, + { 215351, true }, + { 215366, true }, + { 215380, true }, + { 215395, true }, + { 215404, true }, + { 215412, true }, + { 215425, true }, + { 215436, true }, { 215444, true }, - { 215459, false }, - { 215472, true }, - { 215481, true }, - { 215493, true }, - { 215504, true }, - { 215516, true }, - { 215529, true }, - { 215542, true }, - { 215557, true }, - { 215577, true }, - { 215589, true }, - { 215599, true }, + { 215462, true }, + { 215474, true }, + { 215485, true }, + { 215501, true }, + { 215510, true }, + { 215523, true }, + { 215534, true }, + { 215546, true }, + { 215561, false }, + { 215574, true }, + { 215583, true }, + { 215595, true }, { 215606, true }, - { 215616, true }, - { 215628, true }, + { 215618, true }, + { 215631, true }, { 215644, true }, { 215659, true }, - { 215668, true }, - { 215682, true }, - { 215702, true }, - { 215714, true }, - { 215727, true }, - { 215741, true }, - { 215759, true }, - { 215766, true }, - { 215783, true }, - { 215800, true }, - { 215820, true }, - { 215838, true }, - { 215854, false }, - { 215872, true }, - { 215891, true }, - { 215918, true }, - { 215935, true }, - { 215949, true }, - { 215965, true }, - { 215979, true }, - { 215995, true }, - { 216010, false }, - { 216029, true }, - { 216047, true }, - { 216065, true }, - { 216083, true }, - { 216100, true }, - { 216121, true }, - { 216140, true }, - { 216154, true }, - { 216165, true }, - { 216173, true }, - { 216183, true }, - { 216198, true }, - { 216213, true }, - { 216224, true }, - { 216246, true }, - { 216259, true }, + { 215679, true }, + { 215691, true }, + { 215701, true }, + { 215708, true }, + { 215718, true }, + { 215730, true }, + { 215746, true }, + { 215761, true }, + { 215770, true }, + { 215784, true }, + { 215804, true }, + { 215816, true }, + { 215829, true }, + { 215843, true }, + { 215861, true }, + { 215868, true }, + { 215885, true }, + { 215902, true }, + { 215922, false }, + { 215934, true }, + { 215952, true }, + { 215968, false }, + { 215986, true }, + { 216005, true }, + { 216032, true }, + { 216049, true }, + { 216063, true }, + { 216079, true }, + { 216093, true }, + { 216109, true }, + { 216124, false }, + { 216143, true }, + { 216161, true }, + { 216179, true }, + { 216197, true }, + { 216214, true }, + { 216235, true }, + { 216254, true }, + { 216268, true }, { 216279, true }, - { 216294, true }, - { 216313, true }, - { 216339, true }, - { 216355, true }, + { 216287, true }, + { 216297, true }, + { 216312, true }, + { 216327, true }, + { 216338, true }, + { 216360, true }, { 216373, true }, - { 216391, true }, - { 216406, true }, - { 216414, true }, + { 216393, true }, + { 216408, true }, { 216427, true }, - { 216435, true }, - { 216446, true }, - { 216460, true }, - { 216474, true }, - { 216485, true }, - { 216501, true }, - { 216518, true }, + { 216453, true }, + { 216469, true }, + { 216487, true }, + { 216505, true }, + { 216520, true }, { 216528, true }, - { 216538, true }, - { 216551, true }, - { 216569, true }, - { 216582, true }, - { 216608, true }, - { 216627, false }, - { 216637, true }, - { 216653, true }, - { 216670, true }, - { 216686, true }, - { 216709, true }, - { 216734, true }, - { 216747, true }, - { 216758, true }, - { 216773, true }, - { 216783, true }, - { 216798, true }, - { 216810, true }, - { 216828, true }, - { 216853, true }, - { 216865, true }, - { 216877, true }, - { 216889, true }, - { 216900, true }, + { 216541, true }, + { 216549, true }, + { 216560, true }, + { 216574, true }, + { 216588, true }, + { 216599, true }, + { 216615, true }, + { 216632, true }, + { 216642, true }, + { 216652, true }, + { 216665, true }, + { 216683, true }, + { 216696, true }, + { 216722, true }, + { 216741, false }, + { 216751, true }, + { 216767, true }, + { 216784, true }, + { 216800, true }, + { 216823, true }, + { 216848, true }, + { 216861, true }, + { 216872, true }, + { 216887, true }, + { 216897, true }, { 216912, true }, - { 216930, true }, - { 216951, true }, - { 216975, true }, - { 216986, true }, - { 217002, true }, + { 216924, true }, + { 216942, true }, + { 216967, true }, + { 216979, true }, + { 216991, true }, + { 217003, true }, { 217014, true }, - { 217028, true }, - { 217043, true }, - { 217056, true }, - { 217072, false }, - { 217081, true }, - { 217099, true }, - { 217113, true }, - { 217121, false }, - { 217133, true }, - { 217143, true }, - { 217160, true }, + { 217026, true }, + { 217044, true }, + { 217065, true }, + { 217089, true }, + { 217100, true }, + { 217116, true }, + { 217128, true }, + { 217142, true }, + { 217157, true }, { 217170, true }, - { 217181, true }, - { 217188, true }, - { 217199, true }, - { 217219, true }, - { 217236, true }, - { 217248, true }, - { 217265, true }, - { 217285, false }, - { 217300, true }, - { 217311, true }, - { 217320, false }, - { 217327, true }, - { 217337, true }, - { 217348, true }, - { 217364, true }, - { 217373, true }, - { 217388, true }, - { 217400, true }, + { 217186, false }, + { 217195, true }, + { 217213, true }, + { 217227, true }, + { 217235, false }, + { 217247, true }, + { 217257, true }, + { 217274, true }, + { 217284, true }, + { 217295, true }, + { 217302, true }, + { 217313, true }, + { 217333, true }, + { 217350, true }, + { 217362, true }, + { 217379, true }, + { 217399, false }, { 217414, true }, - { 217424, true }, - { 217445, true }, - { 217454, true }, - { 217472, false }, - { 217483, true }, - { 217499, false }, - { 217512, true }, + { 217425, true }, + { 217434, false }, + { 217441, true }, + { 217451, true }, + { 217462, true }, + { 217478, true }, + { 217487, true }, + { 217502, true }, + { 217514, true }, { 217528, true }, - { 217540, true }, - { 217552, true }, - { 217572, true }, - { 217586, true }, - { 217602, true }, - { 217616, true }, - { 217631, true }, - { 217639, true }, + { 217538, true }, + { 217559, true }, + { 217568, true }, + { 217586, false }, + { 217597, true }, + { 217613, false }, + { 217626, true }, + { 217642, true }, { 217654, true }, - { 217667, true }, - { 217683, true }, - { 217696, true }, - { 217709, true }, - { 217723, true }, + { 217666, true }, + { 217686, true }, + { 217700, true }, + { 217716, true }, + { 217730, true }, { 217745, true }, - { 217765, true }, - { 217786, true }, - { 217811, true }, - { 217830, true }, - { 217846, true }, - { 217874, true }, - { 217895, true }, - { 217924, true }, - { 217943, true }, - { 217967, true }, - { 217977, true }, - { 217986, true }, - { 217999, true }, - { 218008, true }, - { 218014, true }, - { 218026, true }, - { 218043, true }, + { 217753, true }, + { 217768, true }, + { 217781, true }, + { 217797, true }, + { 217810, true }, + { 217823, true }, + { 217837, true }, + { 217859, true }, + { 217879, true }, + { 217900, true }, + { 217925, true }, + { 217944, true }, + { 217960, true }, + { 217988, true }, + { 218009, true }, + { 218038, true }, { 218057, true }, - { 218076, true }, - { 218090, true }, - { 218104, false }, - { 218117, true }, - { 218130, true }, - { 218143, true }, - { 218161, true }, - { 218182, true }, - { 218208, true }, - { 218221, true }, + { 218081, true }, + { 218091, true }, + { 218100, true }, + { 218113, true }, + { 218122, true }, + { 218128, true }, + { 218140, true }, + { 218157, true }, + { 218171, true }, + { 218190, true }, + { 218204, true }, + { 218218, false }, { 218231, true }, - { 218250, true }, - { 218269, true }, - { 218286, true }, - { 218306, true }, - { 218325, true }, - { 218341, true }, - { 218361, true }, - { 218370, true }, - { 218381, true }, - { 218390, true }, - { 218409, false }, - { 218425, false }, - { 218438, false }, - { 218451, true }, - { 218462, true }, - { 218473, true }, - { 218492, true }, - { 218505, true }, - { 218517, true }, - { 218530, true }, - { 218549, true }, - { 218564, true }, - { 218577, true }, - { 218592, true }, - { 218608, true }, - { 218622, true }, - { 218639, true }, - { 218648, true }, - { 218662, true }, - { 218686, true }, - { 218701, true }, - { 218717, true }, - { 218735, true }, - { 218752, true }, - { 218769, true }, - { 218784, true }, - { 218802, true }, - { 218818, true }, + { 218244, true }, + { 218257, true }, + { 218275, true }, + { 218296, true }, + { 218322, true }, + { 218335, true }, + { 218345, true }, + { 218364, true }, + { 218383, true }, + { 218400, true }, + { 218420, true }, + { 218439, true }, + { 218455, true }, + { 218475, true }, + { 218484, true }, + { 218495, true }, + { 218504, true }, + { 218523, false }, + { 218539, false }, + { 218552, false }, + { 218565, true }, + { 218576, true }, + { 218587, true }, + { 218606, true }, + { 218619, true }, + { 218631, true }, + { 218644, true }, + { 218663, true }, + { 218678, true }, + { 218691, true }, + { 218706, true }, + { 218722, true }, + { 218736, true }, + { 218753, true }, + { 218762, true }, + { 218776, true }, + { 218800, true }, + { 218815, true }, { 218831, true }, - { 218844, true }, - { 218864, true }, - { 218875, true }, - { 218889, true }, + { 218849, true }, + { 218866, true }, + { 218883, true }, { 218898, true }, - { 218907, true }, - { 218925, true }, - { 218941, true }, - { 218955, true }, - { 218969, true }, - { 218982, true }, - { 218997, true }, - { 219017, true }, - { 219034, true }, - { 219051, true }, - { 219063, true }, - { 219079, true }, - { 219093, true }, - { 219107, true }, - { 219128, true }, - { 219147, true }, - { 219172, false }, - { 219188, true }, - { 219207, true }, - { 219222, true }, - { 219246, true }, - { 219258, true }, - { 219268, true }, - { 219279, true }, - { 219292, true }, - { 219306, true }, - { 219315, true }, - { 219344, true }, + { 218916, true }, + { 218932, true }, + { 218945, true }, + { 218954, true }, + { 218967, true }, + { 218987, true }, + { 218998, true }, + { 219012, true }, + { 219021, true }, + { 219030, true }, + { 219048, true }, + { 219064, true }, + { 219078, true }, + { 219092, true }, + { 219105, true }, + { 219120, true }, + { 219140, true }, + { 219157, true }, + { 219174, true }, + { 219186, true }, + { 219202, true }, + { 219216, true }, + { 219230, true }, + { 219251, true }, + { 219270, true }, + { 219295, false }, + { 219311, true }, + { 219330, true }, + { 219345, true }, { 219369, true }, - { 219394, true }, - { 219423, true }, - { 219435, true }, - { 219451, true }, - { 219460, true }, - { 219472, true }, - { 219486, true }, - { 219500, true }, - { 219514, true }, - { 219531, true }, - { 219544, true }, - { 219563, true }, + { 219381, true }, + { 219391, true }, + { 219402, true }, + { 219415, true }, + { 219429, true }, + { 219438, true }, + { 219467, true }, + { 219492, true }, + { 219517, true }, + { 219546, true }, + { 219558, true }, { 219574, true }, - { 219587, true }, - { 219604, true }, - { 219613, true }, - { 219631, true }, - { 219645, false }, - { 219656, true }, - { 219669, true }, - { 219689, false }, - { 219702, true }, - { 219712, true }, - { 219731, true }, - { 219744, true }, - { 219763, true }, - { 219775, true }, - { 219797, true }, - { 219805, true }, - { 219816, true }, - { 219827, true }, + { 219583, true }, + { 219595, true }, + { 219609, true }, + { 219623, true }, + { 219637, true }, + { 219654, true }, + { 219667, true }, + { 219686, true }, + { 219697, true }, + { 219710, true }, + { 219727, true }, + { 219736, true }, + { 219751, true }, + { 219769, true }, + { 219783, false }, + { 219794, true }, + { 219807, true }, + { 219827, false }, { 219840, true }, - { 219851, true }, - { 219861, true }, - { 219871, true }, - { 219883, true }, - { 219892, true }, - { 219904, true }, - { 219912, true }, - { 219918, true }, - { 219924, false }, - { 219932, true }, - { 219941, true }, - { 219950, true }, - { 219958, true }, - { 219968, true }, - { 219976, true }, - { 219995, true }, - { 220002, true }, - { 220027, true }, - { 220034, true }, - { 220047, true }, - { 220061, true }, - { 220071, true }, - { 220081, true }, - { 220100, true }, - { 220112, true }, - { 220127, true }, - { 220138, true }, - { 220150, true }, - { 220163, true }, - { 220171, true }, - { 220184, true }, - { 220196, true }, - { 220208, true }, - { 220227, true }, - { 220254, true }, - { 220265, false }, + { 219850, true }, + { 219869, true }, + { 219882, true }, + { 219901, true }, + { 219913, true }, + { 219935, true }, + { 219943, true }, + { 219954, true }, + { 219965, true }, + { 219978, true }, + { 219989, true }, + { 219999, true }, + { 220009, true }, + { 220021, true }, + { 220030, true }, + { 220042, true }, + { 220050, true }, + { 220056, true }, + { 220062, false }, + { 220070, true }, + { 220079, true }, + { 220088, true }, + { 220096, true }, + { 220106, true }, + { 220114, true }, + { 220133, true }, + { 220140, true }, + { 220165, true }, + { 220172, true }, + { 220185, true }, + { 220199, true }, + { 220209, true }, + { 220219, true }, + { 220238, true }, + { 220250, true }, + { 220265, true }, { 220276, true }, - { 220291, true }, - { 220307, true }, - { 220329, true }, - { 220343, true }, - { 220356, true }, - { 220369, true }, - { 220388, true }, - { 220417, true }, - { 220433, true }, - { 220454, false }, - { 220481, false }, - { 220497, true }, - { 220513, true }, - { 220528, true }, - { 220544, true }, - { 220562, true }, - { 220581, true }, - { 220590, true }, - { 220603, true }, - { 220620, true }, - { 220639, true }, - { 220652, true }, - { 220670, true }, - { 220691, true }, - { 220704, true }, - { 220723, true }, - { 220750, true }, - { 220768, true }, - { 220785, true }, + { 220288, true }, + { 220301, true }, + { 220309, true }, + { 220322, true }, + { 220334, true }, + { 220346, true }, + { 220365, true }, + { 220392, true }, + { 220403, false }, + { 220414, true }, + { 220429, true }, + { 220445, true }, + { 220467, true }, + { 220481, true }, + { 220494, true }, + { 220507, true }, + { 220526, true }, + { 220555, true }, + { 220571, true }, + { 220592, false }, + { 220619, false }, + { 220635, true }, + { 220651, true }, + { 220666, true }, + { 220682, true }, + { 220700, true }, + { 220719, true }, + { 220728, true }, + { 220741, true }, + { 220758, true }, + { 220777, true }, + { 220790, true }, { 220808, true }, - { 220822, true }, - { 220840, true }, - { 220858, true }, - { 220874, true }, - { 220892, true }, - { 220905, true }, - { 220921, true }, - { 220942, true }, - { 220952, true }, - { 220965, true }, - { 220974, true }, - { 220985, true }, - { 220995, true }, - { 221008, true }, - { 221024, true }, - { 221037, true }, - { 221051, true }, - { 221066, true }, + { 220829, true }, + { 220842, true }, + { 220861, true }, + { 220888, true }, + { 220906, true }, + { 220923, true }, + { 220946, true }, + { 220960, true }, + { 220978, true }, + { 220996, true }, + { 221012, true }, + { 221030, true }, + { 221043, true }, + { 221059, true }, { 221080, true }, - { 221095, true }, - { 221107, true }, + { 221090, true }, + { 221103, true }, + { 221112, true }, { 221123, true }, - { 221139, true }, - { 221152, true }, - { 221167, true }, - { 221177, true }, - { 221186, true }, - { 221198, true }, - { 221231, true }, - { 221265, true }, - { 221299, true }, - { 221314, false }, - { 221331, true }, - { 221349, true }, - { 221373, true }, - { 221394, true }, - { 221413, true }, - { 221430, true }, - { 221454, true }, - { 221473, true }, - { 221486, true }, - { 221500, true }, - { 221508, true }, - { 221519, true }, - { 221533, true }, - { 221545, true }, - { 221554, false }, - { 221564, true }, - { 221584, true }, - { 221598, true }, + { 221133, true }, + { 221146, true }, + { 221162, true }, + { 221175, true }, + { 221189, true }, + { 221204, true }, + { 221218, true }, + { 221233, true }, + { 221245, true }, + { 221261, true }, + { 221277, true }, + { 221290, true }, + { 221305, true }, + { 221315, true }, + { 221324, true }, + { 221336, true }, + { 221369, true }, + { 221403, true }, + { 221437, true }, + { 221452, false }, + { 221469, true }, + { 221487, true }, + { 221511, true }, + { 221532, true }, + { 221551, true }, + { 221568, true }, + { 221592, true }, { 221611, true }, - { 221631, true }, - { 221649, true }, - { 221661, true }, - { 221676, true }, - { 221687, true }, - { 221702, false }, - { 221719, true }, - { 221731, false }, - { 221754, true }, - { 221779, true }, - { 221798, true }, - { 221815, true }, - { 221832, true }, - { 221845, true }, - { 221856, true }, - { 221873, true }, - { 221895, true }, - { 221918, true }, - { 221931, true }, - { 221949, true }, - { 221972, true }, - { 221989, true }, - { 221999, false }, - { 222013, true }, - { 222030, true }, - { 222042, true }, - { 222062, true }, - { 222079, true }, - { 222089, true }, - { 222104, true }, - { 222117, true }, - { 222132, true }, - { 222150, true }, - { 222161, true }, - { 222178, true }, - { 222192, true }, - { 222208, true }, - { 222220, true }, + { 221624, true }, + { 221638, true }, + { 221646, true }, + { 221657, true }, + { 221671, true }, + { 221683, true }, + { 221692, false }, + { 221702, true }, + { 221722, true }, + { 221736, true }, + { 221749, true }, + { 221769, true }, + { 221787, true }, + { 221799, true }, + { 221814, true }, + { 221829, true }, + { 221840, true }, + { 221855, false }, + { 221872, true }, + { 221884, false }, + { 221907, true }, + { 221932, true }, + { 221951, true }, + { 221968, true }, + { 221985, true }, + { 221998, true }, + { 222009, true }, + { 222026, true }, + { 222048, true }, + { 222071, true }, + { 222084, true }, + { 222102, true }, + { 222125, true }, + { 222142, true }, + { 222152, false }, + { 222166, true }, + { 222183, true }, + { 222195, true }, + { 222215, true }, + { 222232, true }, + { 222242, true }, { 222257, true }, - { 222276, true }, - { 222290, true }, - { 222302, true }, - { 222317, true }, - { 222330, true }, - { 222345, false }, - { 222357, true }, - { 222374, false }, - { 222389, true }, - { 222402, true }, + { 222270, true }, + { 222285, true }, + { 222303, true }, + { 222314, true }, + { 222331, true }, + { 222345, true }, + { 222361, true }, + { 222373, true }, { 222410, true }, - { 222431, false }, + { 222429, true }, { 222443, true }, - { 222460, true }, - { 222473, true }, - { 222489, true }, - { 222519, true }, - { 222535, false }, - { 222543, true }, - { 222556, true }, - { 222575, true }, - { 222591, true }, - { 222604, true }, - { 222622, true }, - { 222632, true }, - { 222643, true }, - { 222659, true }, - { 222685, true }, - { 222704, true }, - { 222717, true }, - { 222736, true }, - { 222761, true }, - { 222778, true }, - { 222792, true }, - { 222818, true }, - { 222831, true }, - { 222846, false }, - { 222857, true }, - { 222877, true }, - { 222890, true }, - { 222903, true }, - { 222915, true }, - { 222934, true }, - { 222947, true }, - { 222962, true }, - { 222973, true }, - { 222984, true }, - { 222994, true }, - { 223004, true }, - { 223026, true }, - { 223046, true }, - { 223063, true }, + { 222455, true }, + { 222470, true }, + { 222483, true }, + { 222498, false }, + { 222510, true }, + { 222527, false }, + { 222542, true }, + { 222555, true }, + { 222563, true }, + { 222584, false }, + { 222596, true }, + { 222613, true }, + { 222626, true }, + { 222642, true }, + { 222672, true }, + { 222688, false }, + { 222696, true }, + { 222709, true }, + { 222725, true }, + { 222738, true }, + { 222756, true }, + { 222766, true }, + { 222777, true }, + { 222793, true }, + { 222819, true }, + { 222838, true }, + { 222851, true }, + { 222870, true }, + { 222895, true }, + { 222912, true }, + { 222926, true }, + { 222952, true }, + { 222965, true }, + { 222980, false }, + { 222991, true }, + { 223011, true }, + { 223024, true }, + { 223037, true }, + { 223049, true }, + { 223068, true }, { 223081, true }, - { 223094, true }, + { 223096, true }, { 223107, true }, - { 223122, true }, - { 223133, true }, - { 223144, true }, - { 223159, true }, - { 223183, true }, - { 223199, true }, - { 223221, true }, - { 223232, true }, - { 223248, true }, - { 223264, true }, - { 223277, true }, - { 223301, true }, - { 223316, true }, - { 223329, true }, - { 223348, true }, - { 223358, true }, - { 223372, true }, - { 223383, true }, - { 223400, true }, - { 223412, true }, - { 223426, true }, - { 223443, true }, - { 223460, true }, - { 223472, true }, - { 223483, true }, - { 223498, true }, - { 223515, true }, - { 223524, true }, - { 223544, true }, - { 223561, true }, - { 223576, true }, - { 223602, true }, - { 223620, true }, - { 223630, true }, - { 223647, true }, - { 223664, true }, - { 223679, true }, + { 223118, true }, + { 223128, true }, + { 223138, true }, + { 223160, true }, + { 223180, true }, + { 223197, true }, + { 223215, true }, + { 223228, true }, + { 223241, true }, + { 223256, true }, + { 223267, true }, + { 223278, true }, + { 223293, true }, + { 223317, true }, + { 223333, true }, + { 223355, true }, + { 223366, true }, + { 223382, true }, + { 223398, true }, + { 223411, true }, + { 223435, true }, + { 223450, true }, + { 223463, true }, + { 223482, true }, + { 223492, true }, + { 223506, true }, + { 223517, true }, + { 223534, true }, + { 223546, true }, + { 223560, true }, + { 223577, true }, + { 223594, true }, + { 223606, true }, + { 223617, true }, + { 223632, true }, + { 223649, true }, + { 223658, true }, + { 223678, true }, { 223695, true }, - { 223711, true }, - { 223730, true }, - { 223747, true }, + { 223710, true }, + { 223736, true }, + { 223754, true }, { 223764, true }, - { 223775, true }, - { 223786, true }, + { 223781, true }, { 223798, true }, { 223813, true }, - { 223831, true }, - { 223841, true }, - { 223850, true }, - { 223863, true }, - { 223878, true }, - { 223888, true }, - { 223900, true }, - { 223914, false }, - { 223923, false }, - { 223935, true }, - { 223946, true }, - { 223963, true }, - { 223973, true }, + { 223829, true }, + { 223845, true }, + { 223864, true }, + { 223881, true }, + { 223898, true }, + { 223909, true }, + { 223920, true }, + { 223932, true }, + { 223947, true }, + { 223965, true }, + { 223975, true }, { 223984, true }, - { 223993, true }, - { 224004, true }, - { 224018, false }, - { 224031, true }, - { 224047, true }, - { 224059, true }, - { 224070, true }, - { 224084, false }, - { 224095, true }, + { 223997, true }, + { 224012, true }, + { 224022, true }, + { 224034, true }, + { 224048, false }, + { 224057, false }, + { 224069, true }, + { 224080, true }, + { 224097, true }, + { 224107, true }, { 224118, true }, - { 224140, true }, - { 224148, true }, - { 224158, false }, - { 224170, true }, - { 224183, true }, - { 224191, true }, - { 224199, true }, - { 224211, true }, - { 224226, true }, - { 224236, true }, + { 224127, true }, + { 224138, true }, + { 224152, false }, + { 224165, true }, + { 224181, true }, + { 224193, true }, + { 224204, true }, + { 224218, false }, + { 224229, true }, { 224252, true }, - { 224265, true }, { 224274, true }, - { 224288, true }, - { 224301, true }, - { 224316, true }, + { 224282, true }, + { 224292, false }, + { 224304, true }, + { 224317, true }, { 224325, true }, - { 224334, false }, - { 224343, true }, - { 224362, true }, - { 224375, true }, - { 224390, true }, - { 224412, true }, - { 224428, false }, - { 224440, true }, + { 224333, true }, + { 224345, true }, + { 224360, true }, + { 224370, true }, + { 224386, true }, + { 224399, true }, + { 224408, true }, + { 224422, true }, + { 224435, true }, { 224450, true }, - { 224466, true }, - { 224479, true }, - { 224490, true }, - { 224502, true }, - { 224510, true }, + { 224459, true }, + { 224468, false }, + { 224477, true }, + { 224496, true }, + { 224509, true }, { 224524, true }, - { 224541, true }, - { 224558, true }, - { 224571, true }, - { 224587, true }, - { 224608, true }, - { 224627, true }, - { 224644, true }, - { 224660, true }, - { 224680, true }, + { 224546, true }, + { 224562, true }, + { 224572, true }, + { 224585, true }, + { 224601, true }, + { 224614, true }, + { 224625, true }, + { 224637, true }, + { 224645, true }, + { 224659, true }, + { 224676, true }, { 224693, true }, - { 224704, true }, - { 224718, true }, - { 224738, true }, - { 224758, true }, - { 224782, true }, - { 224805, true }, - { 224816, true }, - { 224838, true }, - { 224863, true }, - { 224875, false }, - { 224888, true }, - { 224906, true }, - { 224920, true }, - { 224934, false }, - { 224955, true }, - { 224972, true }, - { 224982, true }, - { 224994, true }, - { 225006, true }, - { 225018, true }, - { 225037, true }, - { 225063, true }, - { 225076, true }, + { 224706, true }, + { 224722, true }, + { 224743, true }, + { 224762, true }, + { 224779, true }, + { 224795, true }, + { 224815, true }, + { 224828, true }, + { 224839, true }, + { 224853, true }, + { 224873, true }, + { 224893, true }, + { 224917, true }, + { 224940, true }, + { 224951, true }, + { 224973, true }, + { 224998, true }, + { 225010, false }, + { 225023, true }, + { 225041, true }, + { 225055, true }, + { 225069, false }, { 225090, true }, { 225107, true }, - { 225126, true }, - { 225143, true }, - { 225161, true }, - { 225176, true }, - { 225197, true }, - { 225218, true }, - { 225226, false }, - { 225244, true }, - { 225258, true }, - { 225280, true }, - { 225299, true }, + { 225117, true }, + { 225129, true }, + { 225141, true }, + { 225153, true }, + { 225172, true }, + { 225198, true }, + { 225211, true }, + { 225225, true }, + { 225242, true }, + { 225261, true }, + { 225278, true }, + { 225296, true }, { 225311, true }, - { 225324, true }, - { 225336, true }, - { 225357, true }, - { 225381, true }, - { 225391, true }, - { 225406, true }, - { 225421, true }, - { 225438, true }, - { 225460, true }, - { 225478, true }, - { 225494, true }, - { 225513, true }, - { 225527, true }, - { 225544, true }, - { 225554, true }, - { 225569, true }, - { 225585, true }, - { 225612, true }, - { 225626, true }, - { 225642, true }, - { 225657, true }, - { 225670, true }, + { 225332, true }, + { 225353, true }, + { 225361, false }, + { 225379, true }, + { 225393, true }, + { 225415, true }, + { 225434, true }, + { 225446, true }, + { 225459, true }, + { 225471, true }, + { 225492, true }, + { 225516, true }, + { 225526, true }, + { 225541, true }, + { 225556, true }, + { 225573, true }, + { 225595, true }, + { 225613, true }, + { 225629, true }, + { 225648, true }, + { 225662, true }, { 225679, true }, - { 225695, true }, - { 225711, true }, - { 225726, true }, - { 225739, true }, - { 225752, false }, - { 225763, true }, - { 225779, true }, - { 225791, true }, + { 225689, true }, + { 225704, true }, + { 225720, true }, + { 225747, true }, + { 225761, true }, + { 225777, true }, + { 225792, true }, { 225805, true }, - { 225822, true }, - { 225837, true }, - { 225848, true }, - { 225864, true }, - { 225876, true }, - { 225892, true }, - { 225913, true }, - { 225936, true }, - { 225951, true }, - { 225961, true }, - { 225975, true }, - { 225984, true }, - { 225991, true }, - { 226005, true }, - { 226025, true }, - { 226036, true }, - { 226050, true }, - { 226063, false }, - { 226077, true }, - { 226085, true }, + { 225814, true }, + { 225830, true }, + { 225846, true }, + { 225861, true }, + { 225874, true }, + { 225887, false }, + { 225898, true }, + { 225914, true }, + { 225926, true }, + { 225940, true }, + { 225957, true }, + { 225972, true }, + { 225983, true }, + { 225999, true }, + { 226011, true }, + { 226027, true }, + { 226048, true }, + { 226071, true }, + { 226086, true }, { 226096, true }, - { 226114, true }, - { 226124, true }, - { 226141, true }, - { 226154, true }, - { 226164, true }, - { 226175, true }, - { 226200, true }, - { 226214, true }, - { 226225, true }, - { 226236, true }, - { 226251, true }, - { 226267, false }, - { 226278, true }, - { 226293, true }, - { 226308, false }, - { 226327, true }, - { 226338, true }, - { 226348, true }, - { 226359, true }, - { 226379, true }, + { 226110, true }, + { 226119, true }, + { 226126, true }, + { 226140, true }, + { 226160, true }, + { 226171, true }, + { 226185, true }, + { 226198, false }, + { 226212, true }, + { 226220, true }, + { 226231, true }, + { 226249, true }, + { 226259, true }, + { 226276, true }, + { 226289, true }, + { 226299, true }, + { 226310, true }, + { 226335, true }, + { 226349, true }, + { 226360, true }, + { 226371, true }, { 226386, true }, - { 226399, true }, - { 226417, false }, - { 226427, true }, - { 226436, true }, - { 226446, true }, - { 226457, true }, - { 226468, true }, - { 226480, true }, - { 226491, true }, - { 226499, true }, - { 226509, true }, - { 226520, true }, - { 226535, true }, - { 226552, true }, - { 226569, true }, - { 226578, true }, - { 226585, true }, - { 226604, true }, + { 226402, false }, + { 226413, true }, + { 226428, true }, + { 226443, false }, + { 226462, true }, + { 226473, true }, + { 226483, true }, + { 226494, true }, + { 226514, true }, + { 226521, true }, + { 226534, true }, + { 226552, false }, + { 226562, true }, + { 226571, true }, + { 226581, true }, + { 226592, true }, + { 226603, true }, { 226615, true }, - { 226634, false }, - { 226645, true }, - { 226662, true }, - { 226679, true }, - { 226692, true }, - { 226703, true }, - { 226714, true }, - { 226731, true }, - { 226748, false }, - { 226763, false }, - { 226771, true }, + { 226626, true }, + { 226634, true }, + { 226644, true }, + { 226655, true }, + { 226670, true }, + { 226687, true }, + { 226704, true }, + { 226713, true }, + { 226720, true }, + { 226739, true }, + { 226750, true }, + { 226769, false }, { 226780, true }, - { 226803, false }, - { 226816, true }, + { 226797, true }, + { 226814, true }, { 226827, true }, - { 226843, true }, - { 226851, false }, - { 226858, true }, - { 226872, true }, - { 226886, true }, - { 226906, false }, - { 226926, false }, + { 226838, true }, + { 226849, true }, + { 226866, true }, + { 226883, false }, + { 226898, false }, + { 226906, true }, + { 226915, true }, { 226938, false }, - { 226954, true }, - { 226966, true }, + { 226951, true }, + { 226962, true }, { 226978, true }, - { 226997, true }, + { 226986, false }, + { 226993, true }, { 227007, true }, - { 227031, true }, - { 227039, true }, - { 227056, true }, - { 227072, true }, - { 227088, true }, + { 227021, true }, + { 227041, false }, + { 227061, false }, + { 227073, false }, + { 227089, true }, { 227101, true }, - { 227110, true }, - { 227122, true }, - { 227135, true }, - { 227150, true }, - { 227164, true }, - { 227180, false }, - { 227195, true }, - { 227204, true }, - { 227224, true }, - { 227235, true }, - { 227243, true }, + { 227113, true }, + { 227132, true }, + { 227142, true }, + { 227166, true }, + { 227174, true }, + { 227191, true }, + { 227207, true }, + { 227223, true }, + { 227236, true }, + { 227245, true }, { 227257, true }, { 227270, true }, - { 227281, true }, - { 227291, false }, - { 227301, true }, - { 227315, true }, - { 227327, true }, - { 227337, true }, - { 227357, true }, - { 227376, false }, - { 227389, true }, + { 227285, true }, + { 227299, true }, + { 227315, false }, + { 227330, true }, + { 227339, true }, + { 227359, true }, + { 227370, true }, + { 227378, true }, + { 227392, true }, { 227405, true }, - { 227427, true }, - { 227444, true }, - { 227458, true }, - { 227471, true }, - { 227480, true }, - { 227489, true }, - { 227504, true }, - { 227518, true }, - { 227528, true }, - { 227538, true }, - { 227567, true }, + { 227416, true }, + { 227426, false }, + { 227436, true }, + { 227450, true }, + { 227462, true }, + { 227472, true }, + { 227492, true }, + { 227511, false }, + { 227524, true }, + { 227540, true }, + { 227562, true }, { 227579, true }, - { 227591, true }, - { 227612, true }, - { 227626, true }, - { 227637, true }, - { 227652, true }, - { 227666, true }, - { 227686, true }, + { 227593, true }, + { 227606, true }, + { 227615, true }, + { 227624, true }, + { 227639, true }, + { 227653, true }, + { 227663, true }, + { 227673, true }, { 227702, true }, - { 227714, false }, - { 227730, true }, - { 227744, true }, - { 227759, true }, - { 227774, true }, - { 227788, true }, - { 227798, true }, - { 227811, true }, - { 227822, true }, - { 227833, true }, - { 227849, true }, + { 227714, true }, + { 227726, true }, + { 227747, true }, + { 227761, true }, + { 227772, true }, + { 227787, true }, + { 227801, true }, + { 227821, true }, + { 227837, true }, + { 227849, false }, { 227865, true }, - { 227874, true }, - { 227884, true }, - { 227908, false }, - { 227927, false }, - { 227939, true }, - { 227955, true }, - { 227983, true }, - { 228015, true }, - { 228030, true }, - { 228042, true }, - { 228053, true }, - { 228062, true }, - { 228076, true }, - { 228089, true }, - { 228107, true }, - { 228115, true }, - { 228129, true }, - { 228143, true }, - { 228155, true }, - { 228173, true }, - { 228194, true }, - { 228209, true }, - { 228225, true }, + { 227879, true }, + { 227894, true }, + { 227909, true }, + { 227923, true }, + { 227933, true }, + { 227946, true }, + { 227957, true }, + { 227968, true }, + { 227984, true }, + { 228000, true }, + { 228009, true }, + { 228019, true }, + { 228043, false }, + { 228062, false }, + { 228074, true }, + { 228090, true }, + { 228118, true }, + { 228150, true }, + { 228165, true }, + { 228177, true }, + { 228188, true }, + { 228197, true }, + { 228211, true }, + { 228224, true }, { 228242, true }, - { 228255, false }, - { 228263, false }, - { 228275, true }, - { 228284, true }, - { 228294, true }, - { 228305, true }, - { 228317, true }, - { 228333, true }, - { 228349, true }, - { 228359, true }, - { 228370, true }, - { 228381, true }, - { 228393, true }, - { 228404, true }, - { 228416, true }, - { 228426, true }, - { 228435, true }, - { 228454, true }, - { 228482, true }, - { 228496, true }, - { 228510, true }, - { 228529, true }, + { 228250, true }, + { 228264, true }, + { 228278, true }, + { 228290, true }, + { 228308, true }, + { 228329, true }, + { 228344, true }, + { 228360, true }, + { 228377, true }, + { 228390, false }, + { 228398, false }, + { 228410, true }, + { 228419, true }, + { 228429, true }, + { 228440, true }, + { 228452, true }, + { 228468, true }, + { 228484, true }, + { 228494, true }, + { 228505, true }, + { 228516, true }, + { 228528, true }, + { 228539, true }, { 228551, true }, - { 228573, true }, - { 228595, true }, - { 228613, true }, - { 228630, true }, - { 228646, true }, - { 228657, true }, - { 228672, true }, - { 228688, true }, - { 228701, false }, - { 228717, true }, - { 228733, true }, - { 228746, true }, - { 228764, true }, - { 228778, true }, - { 228790, true }, - { 228805, true }, - { 228825, true }, - { 228844, true }, - { 228863, true }, - { 228876, true }, - { 228892, true }, - { 228905, true }, - { 228920, true }, - { 228936, true }, - { 228953, true }, - { 228972, true }, - { 228988, true }, - { 229005, true }, - { 229018, true }, - { 229033, true }, - { 229050, true }, - { 229069, true }, - { 229084, true }, - { 229097, true }, - { 229113, true }, - { 229124, true }, - { 229137, true }, - { 229151, true }, - { 229165, false }, - { 229181, true }, - { 229200, true }, - { 229220, true }, - { 229240, true }, - { 229254, true }, - { 229266, true }, - { 229281, true }, - { 229292, true }, - { 229303, true }, - { 229319, true }, - { 229343, true }, - { 229358, true }, - { 229374, true }, - { 229400, true }, - { 229417, true }, + { 228561, true }, + { 228570, true }, + { 228589, true }, + { 228617, true }, + { 228631, true }, + { 228645, true }, + { 228664, true }, + { 228686, true }, + { 228708, true }, + { 228730, true }, + { 228748, true }, + { 228765, true }, + { 228781, true }, + { 228792, true }, + { 228807, true }, + { 228823, true }, + { 228836, false }, + { 228852, true }, + { 228868, true }, + { 228881, true }, + { 228899, true }, + { 228913, true }, + { 228925, true }, + { 228940, true }, + { 228960, true }, + { 228979, true }, + { 228998, true }, + { 229011, true }, + { 229027, true }, + { 229040, true }, + { 229055, true }, + { 229071, true }, + { 229088, true }, + { 229107, true }, + { 229123, true }, + { 229140, true }, + { 229153, true }, + { 229168, true }, + { 229185, true }, + { 229204, true }, + { 229219, true }, + { 229232, true }, + { 229248, true }, + { 229259, true }, + { 229272, true }, + { 229286, true }, + { 229300, false }, + { 229316, true }, + { 229335, true }, + { 229355, true }, + { 229375, true }, + { 229389, true }, + { 229401, true }, + { 229416, true }, + { 229427, true }, { 229438, true }, - { 229455, true }, - { 229473, true }, - { 229491, false }, - { 229510, true }, - { 229521, true }, - { 229537, true }, - { 229551, true }, - { 229564, true }, - { 229578, true }, - { 229599, true }, - { 229612, true }, - { 229625, true }, - { 229640, true }, - { 229657, true }, + { 229454, true }, + { 229478, true }, + { 229493, true }, + { 229509, true }, + { 229535, true }, + { 229552, true }, + { 229573, true }, + { 229590, true }, + { 229608, true }, + { 229626, false }, + { 229645, true }, + { 229656, true }, { 229672, true }, - { 229688, true }, + { 229686, true }, { 229699, true }, - { 229707, true }, - { 229716, true }, - { 229726, true }, - { 229737, true }, - { 229749, true }, - { 229763, true }, - { 229772, true }, - { 229789, true }, - { 229798, true }, - { 229811, true }, - { 229830, true }, - { 229851, true }, - { 229859, true }, - { 229878, true }, - { 229895, false }, - { 229910, true }, - { 229923, false }, - { 229939, false }, - { 229951, true }, + { 229713, true }, + { 229734, true }, + { 229747, true }, + { 229760, true }, + { 229777, true }, + { 229792, true }, + { 229808, true }, + { 229819, true }, + { 229827, true }, + { 229836, true }, + { 229846, true }, + { 229857, true }, + { 229869, true }, + { 229883, true }, + { 229892, true }, + { 229909, true }, + { 229918, true }, + { 229931, true }, + { 229950, true }, { 229971, true }, - { 229986, true }, - { 229999, true }, - { 230019, true }, - { 230041, true }, - { 230064, true }, - { 230082, true }, - { 230098, true }, - { 230110, true }, - { 230128, true }, - { 230140, true }, - { 230154, true }, - { 230163, true }, - { 230177, true }, - { 230185, true }, - { 230194, true }, - { 230210, true }, - { 230220, true }, - { 230240, true }, - { 230257, true }, - { 230271, true }, - { 230291, true }, - { 230302, true }, - { 230315, true }, + { 229979, true }, + { 229998, true }, + { 230015, false }, + { 230030, true }, + { 230043, false }, + { 230059, false }, + { 230071, true }, + { 230091, true }, + { 230106, true }, + { 230119, true }, + { 230139, true }, + { 230161, true }, + { 230184, true }, + { 230202, true }, + { 230218, true }, + { 230230, true }, + { 230248, true }, + { 230260, true }, + { 230274, true }, + { 230283, true }, + { 230297, true }, + { 230305, true }, + { 230314, true }, { 230330, true }, - { 230342, true }, - { 230358, true }, - { 230371, true }, - { 230392, true }, - { 230400, true }, - { 230410, true }, - { 230427, true }, + { 230340, true }, + { 230360, true }, + { 230377, true }, + { 230391, true }, + { 230411, true }, + { 230422, true }, + { 230435, true }, { 230450, true }, - { 230459, true }, - { 230469, true }, - { 230482, true }, - { 230492, true }, - { 230503, true }, - { 230518, true }, - { 230531, false }, - { 230541, true }, - { 230555, true }, - { 230575, true }, - { 230588, true }, - { 230608, false }, - { 230631, true }, - { 230644, true }, - { 230655, true }, - { 230666, true }, - { 230676, true }, - { 230687, true }, - { 230712, true }, - { 230722, true }, - { 230736, true }, - { 230750, true }, - { 230763, false }, - { 230778, true }, - { 230792, true }, - { 230817, true }, - { 230831, true }, - { 230843, true }, - { 230855, true }, - { 230867, true }, - { 230881, true }, - { 230891, false }, - { 230911, true }, - { 230921, true }, - { 230935, true }, - { 230945, true }, - { 230958, true }, - { 230973, true }, - { 230982, true }, - { 230992, true }, + { 230462, true }, + { 230478, true }, + { 230491, true }, + { 230512, true }, + { 230520, true }, + { 230530, true }, + { 230547, true }, + { 230570, true }, + { 230579, true }, + { 230589, true }, + { 230602, true }, + { 230612, true }, + { 230623, true }, + { 230638, true }, + { 230651, false }, + { 230661, true }, + { 230675, true }, + { 230695, true }, + { 230708, true }, + { 230728, false }, + { 230751, true }, + { 230764, true }, + { 230775, true }, + { 230786, true }, + { 230796, true }, + { 230807, true }, + { 230832, true }, + { 230842, true }, + { 230856, true }, + { 230870, true }, + { 230883, false }, + { 230898, true }, + { 230912, true }, + { 230926, true }, + { 230938, true }, + { 230950, true }, + { 230962, true }, + { 230976, true }, + { 230986, false }, { 231006, true }, - { 231015, true }, - { 231026, true }, - { 231037, true }, - { 231048, true }, - { 231058, true }, - { 231066, true }, - { 231075, false }, - { 231095, true }, + { 231016, true }, + { 231030, true }, + { 231040, true }, + { 231053, true }, + { 231068, true }, + { 231077, true }, + { 231087, true }, + { 231101, true }, { 231110, true }, - { 231122, true }, - { 231134, false }, - { 231144, true }, - { 231159, true }, - { 231178, true }, - { 231198, true }, - { 231226, true }, - { 231251, true }, - { 231261, true }, - { 231274, true }, - { 231288, true }, - { 231303, true }, - { 231329, true }, + { 231121, true }, + { 231132, true }, + { 231143, true }, + { 231153, true }, + { 231161, true }, + { 231170, false }, + { 231190, true }, + { 231205, true }, + { 231217, true }, + { 231229, false }, + { 231239, true }, + { 231254, true }, + { 231273, true }, + { 231293, true }, + { 231321, true }, { 231346, true }, - { 231361, true }, + { 231356, true }, { 231369, true }, - { 231384, true }, - { 231405, false }, - { 231423, true }, - { 231435, true }, - { 231457, true }, - { 231473, true }, - { 231488, true }, - { 231499, true }, - { 231521, true }, - { 231535, true }, - { 231556, true }, - { 231570, true }, - { 231587, true }, - { 231606, true }, - { 231627, true }, - { 231646, true }, - { 231659, true }, - { 231679, true }, - { 231695, true }, - { 231721, true }, + { 231383, true }, + { 231398, true }, + { 231424, true }, + { 231441, true }, + { 231456, true }, + { 231464, true }, + { 231479, true }, + { 231500, false }, + { 231518, true }, + { 231530, true }, + { 231552, true }, + { 231568, true }, + { 231583, true }, + { 231594, true }, + { 231616, true }, + { 231630, true }, + { 231651, true }, + { 231665, true }, + { 231682, true }, + { 231701, true }, + { 231722, true }, { 231741, true }, - { 231762, true }, - { 231781, true }, - { 231805, true }, - { 231824, true }, - { 231840, true }, - { 231865, true }, - { 231891, true }, - { 231902, true }, - { 231926, true }, - { 231952, true }, - { 231970, true }, - { 231981, true }, - { 232003, true }, - { 232019, true }, - { 232037, true }, + { 231754, true }, + { 231774, true }, + { 231790, true }, + { 231816, true }, + { 231836, true }, + { 231857, true }, + { 231876, true }, + { 231900, true }, + { 231919, true }, + { 231935, true }, + { 231960, true }, + { 231986, true }, + { 231997, true }, + { 232021, true }, { 232047, true }, - { 232061, true }, - { 232077, true }, - { 232095, true }, - { 232112, true }, - { 232134, true }, - { 232157, true }, - { 232169, true }, - { 232188, true }, - { 232206, true }, + { 232065, true }, + { 232076, true }, + { 232098, true }, + { 232114, true }, + { 232132, true }, + { 232142, true }, + { 232156, true }, + { 232172, true }, + { 232190, true }, + { 232207, true }, { 232229, true }, - { 232242, true }, - { 232258, true }, - { 232276, true }, - { 232294, true }, - { 232308, true }, - { 232326, true }, - { 232341, true }, - { 232358, true }, - { 232372, true }, - { 232399, true }, - { 232417, true }, - { 232431, true }, - { 232449, true }, - { 232465, true }, - { 232481, true }, + { 232252, true }, + { 232264, true }, + { 232283, true }, + { 232301, true }, + { 232324, true }, + { 232337, true }, + { 232353, true }, + { 232371, true }, + { 232389, true }, + { 232403, true }, + { 232421, true }, + { 232436, true }, + { 232453, true }, + { 232467, true }, { 232494, true }, - { 232514, true }, - { 232532, true }, - { 232551, true }, - { 232564, true }, - { 232600, true }, - { 232623, true }, - { 232643, true }, - { 232658, true }, - { 232676, true }, - { 232693, true }, - { 232712, true }, - { 232723, true }, - { 232741, true }, + { 232512, true }, + { 232526, true }, + { 232544, true }, + { 232560, true }, + { 232576, true }, + { 232589, true }, + { 232609, true }, + { 232627, true }, + { 232646, true }, + { 232659, true }, + { 232695, true }, + { 232718, true }, + { 232738, true }, + { 232753, true }, { 232771, true }, - { 232787, true }, - { 232802, true }, - { 232817, true }, - { 232828, true }, - { 232842, true }, - { 232864, true }, - { 232878, true }, - { 232893, true }, - { 232908, true }, - { 232929, true }, - { 232942, true }, - { 232957, true }, - { 232970, true }, - { 232993, true }, - { 233002, true }, + { 232788, true }, + { 232807, true }, + { 232818, true }, + { 232836, true }, + { 232866, true }, + { 232882, true }, + { 232897, true }, + { 232912, true }, + { 232923, true }, + { 232937, true }, + { 232959, true }, + { 232973, true }, + { 232988, true }, + { 233003, true }, { 233024, true }, - { 233034, true }, - { 233055, true }, - { 233079, true }, - { 233105, true }, - { 233123, true }, - { 233134, true }, - { 233151, true }, - { 233169, true }, - { 233184, true }, + { 233037, true }, + { 233052, true }, + { 233065, true }, + { 233088, true }, + { 233097, true }, + { 233119, true }, + { 233129, true }, + { 233150, true }, + { 233174, true }, { 233200, true }, - { 233214, true }, - { 233227, true }, - { 233243, true }, - { 233262, true }, - { 233280, true }, - { 233304, true }, - { 233317, true }, - { 233334, true }, - { 233356, true }, + { 233218, true }, + { 233229, true }, + { 233246, true }, + { 233264, true }, + { 233279, true }, + { 233295, true }, + { 233309, true }, + { 233322, true }, + { 233338, true }, + { 233357, true }, { 233375, true }, - { 233395, true }, - { 233412, false }, - { 233427, true }, - { 233445, true }, - { 233467, true }, - { 233483, true }, - { 233502, true }, - { 233514, true }, + { 233399, true }, + { 233412, true }, + { 233429, true }, + { 233451, true }, + { 233470, true }, + { 233490, true }, + { 233507, false }, + { 233522, true }, { 233540, true }, - { 233552, true }, - { 233564, true }, - { 233580, true }, - { 233598, true }, - { 233617, true }, - { 233637, true }, - { 233657, true }, - { 233673, true }, - { 233692, true }, - { 233703, true }, - { 233733, false }, - { 233747, true }, - { 233764, true }, - { 233785, true }, - { 233805, true }, - { 233819, true }, - { 233837, true }, - { 233854, true }, - { 233870, true }, + { 233562, true }, + { 233578, true }, + { 233597, true }, + { 233609, true }, + { 233635, true }, + { 233647, true }, + { 233659, true }, + { 233675, true }, + { 233693, true }, + { 233712, true }, + { 233732, true }, + { 233752, true }, + { 233768, true }, + { 233787, true }, + { 233798, true }, + { 233828, false }, + { 233842, true }, + { 233859, true }, { 233880, true }, - { 233896, true }, - { 233907, true }, - { 233919, true }, - { 233938, true }, - { 233954, true }, - { 233974, true }, - { 233988, true }, - { 234001, true }, - { 234012, true }, + { 233900, true }, + { 233914, true }, + { 233932, true }, + { 233949, true }, + { 233965, true }, + { 233975, true }, + { 233991, true }, + { 234002, true }, + { 234014, true }, { 234033, true }, - { 234061, true }, - { 234077, true }, - { 234090, true }, - { 234115, true }, - { 234132, true }, - { 234149, false }, - { 234164, true }, - { 234189, true }, + { 234049, true }, + { 234069, true }, + { 234083, true }, + { 234096, true }, + { 234107, true }, + { 234128, true }, + { 234156, true }, + { 234172, true }, + { 234185, true }, { 234210, true }, - { 234219, true }, - { 234229, true }, - { 234241, true }, - { 234256, true }, - { 234275, true }, - { 234294, true }, - { 234311, true }, - { 234332, true }, - { 234349, true }, - { 234365, false }, - { 234383, true }, - { 234400, true }, - { 234413, true }, - { 234437, true }, - { 234455, true }, - { 234476, true }, - { 234491, true }, - { 234506, true }, - { 234518, true }, - { 234543, true }, + { 234227, true }, + { 234244, true }, + { 234269, true }, + { 234290, true }, + { 234299, true }, + { 234309, true }, + { 234321, true }, + { 234336, true }, + { 234355, true }, + { 234374, true }, + { 234391, true }, + { 234412, true }, + { 234429, true }, + { 234445, false }, + { 234463, true }, + { 234480, true }, + { 234493, true }, + { 234517, true }, + { 234535, true }, { 234556, true }, - { 234578, true }, - { 234588, true }, - { 234605, true }, - { 234624, true }, - { 234637, true }, - { 234651, true }, - { 234664, true }, - { 234688, true }, - { 234702, true }, - { 234724, true }, - { 234757, true }, - { 234772, true }, - { 234786, true }, - { 234795, true }, + { 234571, true }, + { 234586, true }, + { 234598, true }, + { 234623, true }, + { 234636, true }, + { 234658, true }, + { 234668, true }, + { 234685, true }, + { 234704, true }, + { 234717, true }, + { 234731, true }, + { 234744, true }, + { 234768, true }, + { 234782, true }, { 234804, true }, - { 234818, true }, - { 234828, false }, - { 234842, true }, - { 234851, true }, - { 234862, true }, - { 234876, true }, - { 234887, true }, - { 234905, true }, - { 234920, true }, - { 234933, true }, - { 234943, true }, - { 234958, true }, - { 234971, true }, - { 234990, true }, - { 235010, true }, - { 235033, true }, - { 235040, true }, - { 235056, true }, - { 235074, true }, - { 235095, true }, - { 235107, true }, - { 235137, true }, - { 235150, true }, - { 235160, true }, - { 235172, true }, - { 235186, true }, - { 235200, true }, - { 235215, true }, - { 235226, true }, - { 235239, true }, - { 235251, true }, - { 235262, true }, - { 235276, true }, + { 234837, true }, + { 234852, true }, + { 234866, true }, + { 234875, true }, + { 234884, true }, + { 234898, true }, + { 234908, false }, + { 234922, true }, + { 234931, true }, + { 234942, true }, + { 234956, true }, + { 234967, true }, + { 234985, true }, + { 235000, true }, + { 235013, true }, + { 235023, true }, + { 235038, true }, + { 235051, true }, + { 235070, true }, + { 235090, true }, + { 235113, true }, + { 235120, true }, + { 235136, true }, + { 235154, true }, + { 235175, true }, + { 235187, true }, + { 235217, true }, + { 235230, true }, + { 235240, true }, + { 235252, true }, + { 235266, true }, + { 235280, true }, { 235295, true }, - { 235310, true }, - { 235322, true }, - { 235334, true }, - { 235345, true }, - { 235360, true }, + { 235306, true }, + { 235319, true }, + { 235331, true }, + { 235342, true }, + { 235356, true }, { 235375, true }, - { 235387, true }, - { 235403, true }, - { 235418, true }, - { 235432, true }, - { 235448, true }, - { 235457, true }, - { 235466, true }, - { 235477, false }, - { 235492, true }, - { 235506, true }, - { 235515, true }, - { 235531, true }, - { 235544, true }, - { 235554, true }, - { 235574, true }, - { 235588, true }, - { 235601, false }, - { 235621, true }, - { 235635, true }, - { 235649, true }, - { 235660, true }, - { 235677, true }, - { 235691, true }, - { 235703, true }, - { 235717, true }, + { 235390, true }, + { 235402, true }, + { 235414, true }, + { 235425, true }, + { 235440, true }, + { 235455, true }, + { 235467, true }, + { 235483, true }, + { 235498, true }, + { 235512, true }, + { 235528, true }, + { 235537, true }, + { 235546, true }, + { 235557, false }, + { 235572, true }, + { 235586, true }, + { 235595, true }, + { 235611, true }, + { 235624, true }, + { 235634, true }, + { 235654, true }, + { 235668, true }, + { 235681, false }, + { 235701, true }, + { 235715, true }, { 235729, true }, - { 235741, true }, - { 235753, true }, - { 235765, true }, - { 235775, true }, - { 235790, true }, - { 235803, true }, - { 235820, true }, - { 235847, true }, - { 235860, true }, - { 235874, true }, - { 235899, true }, - { 235917, true }, - { 235929, true }, + { 235740, true }, + { 235757, true }, + { 235771, true }, + { 235783, true }, + { 235797, true }, + { 235809, true }, + { 235821, true }, + { 235833, true }, + { 235845, true }, + { 235855, true }, + { 235870, true }, + { 235883, true }, + { 235900, true }, + { 235927, true }, { 235940, true }, - { 235948, true }, - { 235960, true }, - { 235973, true }, - { 236000, true }, + { 235954, true }, + { 235979, true }, + { 235997, true }, { 236009, true }, - { 236024, true }, - { 236042, true }, - { 236049, false }, - { 236062, true }, - { 236070, true }, + { 236020, true }, + { 236028, true }, + { 236040, true }, + { 236053, true }, { 236080, true }, - { 236100, true }, - { 236109, true }, - { 236119, true }, - { 236127, true }, - { 236140, true }, - { 236149, true }, - { 236161, true }, - { 236174, true }, - { 236183, true }, - { 236193, true }, - { 236203, true }, - { 236213, true }, - { 236223, true }, - { 236233, true }, - { 236242, true }, - { 236249, true }, - { 236265, true }, - { 236282, true }, - { 236289, true }, + { 236089, true }, + { 236104, true }, + { 236122, true }, + { 236129, false }, + { 236142, true }, + { 236150, true }, + { 236160, true }, + { 236180, true }, + { 236189, true }, + { 236199, true }, + { 236207, true }, + { 236220, true }, + { 236229, true }, + { 236241, true }, + { 236254, true }, + { 236263, true }, + { 236273, true }, + { 236283, true }, + { 236293, true }, { 236303, true }, - { 236320, true }, - { 236332, true }, - { 236352, true }, - { 236361, true }, + { 236313, true }, + { 236322, true }, + { 236329, true }, + { 236345, true }, + { 236362, true }, { 236369, true }, - { 236376, true }, - { 236385, true }, - { 236394, true }, - { 236406, true }, - { 236420, true }, - { 236437, true }, - { 236453, true }, - { 236469, true }, - { 236488, true }, - { 236506, true }, - { 236524, true }, - { 236541, true }, - { 236556, true }, - { 236571, true }, - { 236589, true }, - { 236606, true }, - { 236616, true }, - { 236625, true }, - { 236635, true }, - { 236645, true }, - { 236655, true }, - { 236667, true }, - { 236685, true }, - { 236702, true }, - { 236716, true }, - { 236731, true }, - { 236746, true }, - { 236758, true }, - { 236772, true }, - { 236780, true }, - { 236790, true }, - { 236803, true }, - { 236813, true }, - { 236828, true }, - { 236840, true }, - { 236854, true }, - { 236863, true }, - { 236872, false }, - { 236884, true }, - { 236897, false }, - { 236930, true }, - { 236945, true }, - { 236956, true }, - { 236979, true }, - { 236992, true }, - { 237003, true }, - { 237017, true }, - { 237037, true }, - { 237050, true }, - { 237064, true }, - { 237077, true }, - { 237093, true }, - { 237103, true }, - { 237117, true }, - { 237135, true }, - { 237149, true }, - { 237165, true }, - { 237180, true }, - { 237202, true }, - { 237212, true }, - { 237224, true }, - { 237238, true }, - { 237254, true }, - { 237266, true }, - { 237276, true }, - { 237289, true }, - { 237306, true }, - { 237320, true }, - { 237328, true }, - { 237340, true }, - { 237354, true }, - { 237365, true }, - { 237374, true }, - { 237382, true }, - { 237394, false }, - { 237402, true }, - { 237413, true }, - { 237429, true }, - { 237440, true }, - { 237453, true }, - { 237465, false }, - { 237479, true }, - { 237492, true }, - { 237503, true }, - { 237513, true }, - { 237527, true }, - { 237546, true }, - { 237557, true }, - { 237571, true }, + { 236383, true }, + { 236400, true }, + { 236412, true }, + { 236432, true }, + { 236441, true }, + { 236449, true }, + { 236456, true }, + { 236465, true }, + { 236474, true }, + { 236486, true }, + { 236500, true }, + { 236517, true }, + { 236533, true }, + { 236549, true }, + { 236568, true }, + { 236586, true }, + { 236604, true }, + { 236621, true }, + { 236636, true }, + { 236651, true }, + { 236669, true }, + { 236686, true }, + { 236696, true }, + { 236705, true }, + { 236715, true }, + { 236725, true }, + { 236735, true }, + { 236747, true }, + { 236765, true }, + { 236782, true }, + { 236796, true }, + { 236811, true }, + { 236826, true }, + { 236838, true }, + { 236852, true }, + { 236860, true }, + { 236870, true }, + { 236883, true }, + { 236893, true }, + { 236908, true }, + { 236920, true }, + { 236934, true }, + { 236943, true }, + { 236952, false }, + { 236964, true }, + { 236977, false }, + { 237010, true }, + { 237025, true }, + { 237048, true }, + { 237061, true }, + { 237072, true }, + { 237086, true }, + { 237106, true }, + { 237119, true }, + { 237133, true }, + { 237146, true }, + { 237162, true }, + { 237172, true }, + { 237186, true }, + { 237204, true }, + { 237218, true }, + { 237234, true }, + { 237249, true }, + { 237271, true }, + { 237281, true }, + { 237293, true }, + { 237307, true }, + { 237323, true }, + { 237335, true }, + { 237345, true }, + { 237358, true }, + { 237375, true }, + { 237389, true }, + { 237397, true }, + { 237409, true }, + { 237423, true }, + { 237434, true }, + { 237443, true }, + { 237451, true }, + { 237463, false }, + { 237471, true }, + { 237482, true }, + { 237498, true }, + { 237509, true }, + { 237522, true }, + { 237534, false }, + { 237548, true }, + { 237561, true }, + { 237572, true }, { 237582, true }, - { 237593, true }, - { 237604, true }, + { 237596, true }, { 237615, true }, { 237626, true }, { 237640, true }, - { 237652, true }, - { 237667, true }, - { 237681, true }, - { 237696, true }, + { 237651, true }, + { 237662, true }, + { 237673, true }, + { 237684, true }, + { 237695, true }, { 237709, true }, - { 237725, true }, - { 237734, true }, - { 237743, true }, - { 237757, true }, - { 237768, true }, - { 237779, false }, - { 237795, true }, - { 237806, true }, - { 237817, true }, - { 237827, true }, - { 237843, true }, - { 237850, false }, + { 237721, true }, + { 237736, true }, + { 237750, true }, + { 237765, true }, + { 237778, true }, + { 237794, true }, + { 237803, true }, + { 237812, true }, + { 237826, true }, + { 237837, true }, + { 237848, false }, { 237864, true }, - { 237877, true }, + { 237875, true }, { 237886, true }, { 237896, true }, - { 237909, true }, - { 237919, true }, - { 237943, true }, - { 237956, true }, - { 237966, true }, - { 237979, true }, - { 237993, true }, - { 238005, true }, - { 238019, true }, - { 238040, true }, - { 238055, true }, - { 238069, true }, - { 238081, true }, - { 238096, false }, - { 238115, true }, - { 238125, true }, - { 238137, true }, - { 238147, true }, - { 238159, true }, - { 238176, true }, - { 238193, true }, - { 238212, true }, - { 238221, false }, - { 238236, true }, - { 238254, false }, - { 238266, true }, - { 238292, true }, - { 238303, true }, - { 238324, true }, - { 238339, true }, - { 238357, true }, - { 238374, true }, - { 238387, true }, - { 238403, true }, - { 238418, true }, - { 238433, true }, - { 238445, true }, + { 237912, true }, + { 237919, false }, + { 237933, true }, + { 237946, true }, + { 237955, true }, + { 237965, true }, + { 237978, true }, + { 237988, true }, + { 238012, true }, + { 238025, true }, + { 238035, true }, + { 238048, true }, + { 238062, true }, + { 238074, true }, + { 238088, true }, + { 238109, true }, + { 238124, true }, + { 238138, true }, + { 238150, true }, + { 238165, false }, + { 238184, true }, + { 238194, true }, + { 238206, true }, + { 238216, true }, + { 238228, true }, + { 238245, true }, + { 238262, true }, + { 238281, true }, + { 238290, false }, + { 238305, true }, + { 238323, false }, + { 238335, true }, + { 238361, true }, + { 238372, true }, + { 238393, true }, + { 238408, true }, + { 238426, true }, + { 238443, true }, { 238456, true }, - { 238469, true }, - { 238479, true }, - { 238497, true }, - { 238517, true }, - { 238536, true }, - { 238564, true }, - { 238578, true }, - { 238597, true }, - { 238618, true }, - { 238627, true }, - { 238651, false }, - { 238670, true }, - { 238684, true }, - { 238702, true }, - { 238717, true }, - { 238734, true }, - { 238754, true }, - { 238768, true }, - { 238778, true }, - { 238799, true }, - { 238817, true }, - { 238830, true }, - { 238851, true }, - { 238863, true }, - { 238874, true }, - { 238889, true }, - { 238904, true }, - { 238915, true }, - { 238936, true }, - { 238955, true }, - { 238966, true }, - { 238995, true }, - { 239020, true }, - { 239041, true }, - { 239048, true }, - { 239060, true }, - { 239076, true }, - { 239091, true }, - { 239107, true }, - { 239124, true }, - { 239146, true }, - { 239156, true }, - { 239168, true }, - { 239180, true }, - { 239197, true }, - { 239206, true }, - { 239219, false }, - { 239232, false }, - { 239252, true }, - { 239262, true }, - { 239274, true }, - { 239291, true }, - { 239307, true }, - { 239322, true }, - { 239340, true }, - { 239353, true }, - { 239368, true }, - { 239381, true }, - { 239397, true }, - { 239415, true }, - { 239427, true }, - { 239446, true }, - { 239463, true }, - { 239474, true }, - { 239494, true }, - { 239505, true }, - { 239524, true }, - { 239550, true }, - { 239569, true }, - { 239588, true }, - { 239598, true }, - { 239613, true }, - { 239625, true }, - { 239643, true }, - { 239660, true }, - { 239673, true }, - { 239686, true }, - { 239699, true }, - { 239712, true }, - { 239725, true }, + { 238472, true }, + { 238487, true }, + { 238502, true }, + { 238514, true }, + { 238525, true }, + { 238538, true }, + { 238548, true }, + { 238566, true }, + { 238586, true }, + { 238605, true }, + { 238633, true }, + { 238647, true }, + { 238666, true }, + { 238687, true }, + { 238696, true }, + { 238720, false }, + { 238739, true }, + { 238753, true }, + { 238771, true }, + { 238786, true }, + { 238803, true }, + { 238823, true }, + { 238837, true }, + { 238847, true }, + { 238868, true }, + { 238886, true }, + { 238899, true }, + { 238920, true }, + { 238932, true }, + { 238943, true }, + { 238958, true }, + { 238973, true }, + { 238984, true }, + { 239005, true }, + { 239024, true }, + { 239035, true }, + { 239064, true }, + { 239089, true }, + { 239110, true }, + { 239117, true }, + { 239129, true }, + { 239145, true }, + { 239160, true }, + { 239176, true }, + { 239193, true }, + { 239215, true }, + { 239225, true }, + { 239237, true }, + { 239249, true }, + { 239266, true }, + { 239275, true }, + { 239288, false }, + { 239301, false }, + { 239321, true }, + { 239331, true }, + { 239343, true }, + { 239360, true }, + { 239376, true }, + { 239391, true }, + { 239409, true }, + { 239422, true }, + { 239437, true }, + { 239450, true }, + { 239466, true }, + { 239484, true }, + { 239496, true }, + { 239515, true }, + { 239532, true }, + { 239543, true }, + { 239563, true }, + { 239574, true }, + { 239593, true }, + { 239619, true }, + { 239638, true }, + { 239657, true }, + { 239667, true }, + { 239682, true }, + { 239694, true }, + { 239714, true }, + { 239732, true }, { 239749, true }, - { 239760, true }, - { 239772, true }, - { 239787, true }, - { 239803, true }, - { 239813, true }, - { 239826, true }, - { 239844, true }, - { 239862, true }, - { 239881, true }, - { 239893, true }, - { 239906, true }, - { 239924, true }, - { 239946, true }, - { 239959, true }, - { 239981, true }, - { 239998, true }, - { 240014, true }, - { 240042, true }, - { 240067, true }, - { 240099, true }, - { 240118, true }, - { 240138, true }, - { 240153, true }, - { 240173, true }, - { 240186, true }, - { 240211, true }, + { 239762, true }, + { 239775, true }, + { 239788, true }, + { 239801, true }, + { 239814, true }, + { 239838, true }, + { 239849, true }, + { 239861, true }, + { 239876, true }, + { 239892, true }, + { 239902, true }, + { 239915, true }, + { 239933, true }, + { 239951, true }, + { 239970, true }, + { 239982, true }, + { 239995, true }, + { 240013, true }, + { 240035, true }, + { 240048, true }, + { 240070, true }, + { 240087, true }, + { 240103, true }, + { 240131, true }, + { 240156, true }, + { 240188, true }, + { 240207, true }, { 240227, true }, - { 240244, true }, - { 240261, true }, - { 240273, true }, - { 240286, true }, - { 240299, true }, - { 240324, true }, - { 240342, true }, - { 240356, true }, - { 240377, true }, - { 240389, true }, - { 240404, true }, - { 240421, true }, - { 240433, true }, - { 240452, true }, - { 240469, true }, - { 240487, true }, - { 240502, true }, - { 240513, true }, - { 240527, true }, - { 240546, true }, - { 240563, true }, - { 240578, true }, - { 240588, true }, - { 240600, true }, - { 240620, true }, - { 240634, true }, - { 240648, true }, - { 240658, true }, - { 240671, true }, - { 240690, true }, - { 240702, true }, - { 240716, true }, - { 240725, true }, - { 240739, true }, - { 240753, true }, - { 240763, true }, - { 240775, true }, - { 240786, true }, - { 240804, true }, - { 240820, true }, - { 240832, true }, - { 240843, true }, - { 240855, true }, - { 240866, true }, - { 240878, true }, - { 240890, true }, - { 240899, true }, - { 240909, true }, - { 240923, true }, - { 240937, true }, - { 240951, true }, - { 240965, true }, - { 240983, true }, - { 240994, true }, - { 241002, true }, - { 241018, true }, - { 241033, true }, - { 241051, true }, - { 241071, true }, - { 241079, true }, - { 241100, true }, - { 241111, true }, - { 241126, true }, - { 241141, false }, - { 241159, false }, - { 241180, true }, - { 241189, true }, - { 241212, true }, - { 241235, true }, - { 241252, true }, - { 241264, true }, - { 241285, true }, - { 241311, true }, - { 241328, true }, - { 241345, true }, + { 240242, true }, + { 240262, true }, + { 240275, true }, + { 240300, true }, + { 240316, true }, + { 240333, true }, + { 240350, true }, + { 240362, true }, + { 240375, true }, + { 240388, true }, + { 240413, true }, + { 240431, true }, + { 240445, true }, + { 240466, true }, + { 240478, true }, + { 240493, true }, + { 240510, true }, + { 240522, true }, + { 240555, true }, + { 240574, true }, + { 240591, true }, + { 240609, true }, + { 240624, true }, + { 240635, true }, + { 240649, true }, + { 240668, true }, + { 240685, true }, + { 240700, true }, + { 240710, true }, + { 240722, true }, + { 240742, true }, + { 240756, true }, + { 240770, true }, + { 240780, true }, + { 240793, true }, + { 240812, true }, + { 240824, true }, + { 240838, true }, + { 240847, true }, + { 240861, true }, + { 240875, true }, + { 240885, true }, + { 240897, true }, + { 240908, true }, + { 240926, false }, + { 240934, true }, + { 240950, true }, + { 240962, true }, + { 240973, true }, + { 240985, true }, + { 240996, true }, + { 241008, true }, + { 241020, true }, + { 241029, true }, + { 241039, true }, + { 241053, true }, + { 241067, true }, + { 241081, true }, + { 241095, true }, + { 241113, true }, + { 241124, true }, + { 241132, true }, + { 241148, true }, + { 241163, true }, + { 241181, true }, + { 241201, true }, + { 241209, true }, + { 241230, true }, + { 241241, true }, + { 241256, true }, + { 241271, false }, + { 241289, false }, + { 241310, true }, + { 241319, true }, + { 241342, true }, { 241365, true }, - { 241378, true }, - { 241392, true }, - { 241414, true }, - { 241431, true }, - { 241448, true }, - { 241468, true }, - { 241493, true }, - { 241518, true }, + { 241382, true }, + { 241394, true }, + { 241415, true }, + { 241441, true }, + { 241458, true }, + { 241475, true }, + { 241495, true }, + { 241508, true }, + { 241522, true }, { 241544, true }, - { 241560, true }, - { 241571, true }, - { 241589, true }, + { 241561, true }, + { 241578, true }, { 241598, true }, - { 241608, true }, - { 241619, true }, - { 241632, true }, - { 241646, true }, - { 241655, true }, - { 241677, true }, - { 241689, true }, - { 241697, false }, - { 241711, true }, + { 241623, true }, + { 241648, true }, + { 241674, true }, + { 241690, true }, + { 241701, true }, { 241719, true }, - { 241730, true }, - { 241740, true }, - { 241750, true }, - { 241757, true }, - { 241768, true }, - { 241780, true }, - { 241790, true }, - { 241797, true }, - { 241809, true }, - { 241821, true }, - { 241830, true }, - { 241840, true }, - { 241850, true }, - { 241861, true }, - { 241872, true }, + { 241728, true }, + { 241738, true }, + { 241749, true }, + { 241762, true }, + { 241776, true }, + { 241785, true }, + { 241807, true }, + { 241819, true }, + { 241827, false }, + { 241841, true }, + { 241849, true }, + { 241860, true }, + { 241870, true }, { 241880, true }, - { 241901, true }, - { 241914, true }, - { 241926, true }, - { 241937, true }, + { 241887, true }, + { 241898, true }, + { 241910, true }, + { 241920, true }, + { 241927, true }, + { 241939, true }, { 241951, true }, - { 241977, true }, - { 242007, false }, - { 242021, true }, - { 242037, true }, - { 242053, true }, - { 242066, true }, - { 242078, true }, - { 242093, true }, - { 242106, true }, - { 242127, true }, - { 242143, true }, - { 242155, true }, - { 242165, true }, - { 242187, true }, - { 242218, true }, - { 242235, true }, - { 242252, true }, - { 242265, true }, - { 242276, false }, - { 242287, true }, - { 242297, true }, - { 242309, true }, - { 242321, true }, - { 242335, true }, - { 242346, false }, - { 242359, false }, - { 242379, true }, - { 242389, true }, - { 242397, false }, - { 242406, true }, - { 242419, true }, - { 242477, true }, - { 242523, true }, - { 242577, true }, - { 242624, true }, - { 242673, true }, - { 242718, true }, - { 242768, true }, - { 242822, true }, - { 242868, true }, - { 242915, true }, - { 242969, true }, - { 242996, true }, - { 243029, true }, - { 243042, true }, - { 243055, true }, - { 243071, true }, - { 243094, true }, - { 243110, true }, - { 243123, true }, - { 243139, true }, - { 243149, true }, - { 243160, false }, + { 241960, true }, + { 241970, true }, + { 241980, true }, + { 241991, true }, + { 242002, true }, + { 242010, true }, + { 242031, true }, + { 242044, true }, + { 242056, true }, + { 242067, true }, + { 242081, true }, + { 242107, true }, + { 242137, false }, + { 242151, true }, + { 242167, true }, + { 242183, true }, + { 242196, true }, + { 242208, true }, + { 242223, true }, + { 242236, true }, + { 242257, true }, + { 242273, true }, + { 242285, true }, + { 242295, true }, + { 242317, true }, + { 242348, true }, + { 242365, true }, + { 242382, true }, + { 242395, true }, + { 242406, false }, + { 242417, true }, + { 242427, true }, + { 242439, true }, + { 242451, true }, + { 242465, true }, + { 242476, false }, + { 242489, false }, + { 242509, true }, + { 242519, true }, + { 242527, false }, + { 242536, true }, + { 242549, true }, + { 242607, true }, + { 242653, true }, + { 242707, true }, + { 242754, true }, + { 242803, true }, + { 242848, true }, + { 242898, true }, + { 242952, true }, + { 242998, true }, + { 243045, true }, + { 243099, true }, + { 243126, true }, + { 243159, true }, { 243172, true }, - { 243189, true }, - { 243206, true }, + { 243185, true }, + { 243201, true }, { 243224, true }, - { 243238, true }, - { 243256, true }, - { 243272, true }, - { 243283, true }, - { 243294, true }, + { 243240, true }, + { 243253, true }, + { 243269, true }, + { 243279, true }, + { 243290, false }, { 243302, true }, - { 243312, true }, { 243319, true }, - { 243328, true }, { 243336, true }, - { 243346, true }, - { 243357, true }, - { 243364, true }, - { 243382, true }, - { 243401, true }, - { 243414, true }, - { 243428, true }, - { 243440, true }, - { 243454, true }, - { 243469, true }, - { 243481, true }, + { 243354, true }, + { 243368, true }, + { 243386, true }, + { 243402, true }, + { 243413, true }, + { 243424, true }, + { 243432, true }, + { 243442, true }, + { 243449, true }, + { 243458, true }, + { 243466, true }, + { 243476, true }, + { 243487, true }, { 243494, true }, - { 243505, true }, - { 243526, true }, - { 243536, true }, - { 243545, true }, - { 243554, true }, - { 243561, true }, - { 243568, true }, - { 243592, true }, - { 243606, true }, - { 243616, true }, - { 243633, false }, - { 243648, true }, - { 243660, true }, - { 243674, true }, - { 243686, true }, - { 243700, true }, - { 243711, true }, - { 243723, true }, - { 243735, true }, - { 243742, true }, - { 243754, true }, - { 243767, true }, - { 243777, true }, - { 243788, true }, + { 243512, true }, + { 243531, true }, + { 243544, true }, + { 243558, true }, + { 243570, true }, + { 243584, true }, + { 243599, true }, + { 243611, true }, + { 243624, true }, + { 243635, true }, + { 243656, true }, + { 243666, true }, + { 243675, true }, + { 243684, true }, + { 243691, true }, + { 243698, true }, + { 243722, true }, + { 243736, true }, + { 243746, true }, + { 243763, false }, + { 243778, true }, + { 243790, true }, { 243804, true }, - { 243819, true }, + { 243818, true }, { 243829, true }, - { 243848, true }, + { 243841, true }, + { 243853, true }, { 243860, true }, - { 243867, true }, - { 243889, true }, - { 243900, true }, - { 243915, true }, - { 243938, true }, - { 243945, true }, - { 243955, true }, - { 243966, true }, - { 243976, true }, + { 243872, true }, + { 243882, true }, + { 243893, true }, + { 243909, true }, + { 243924, true }, + { 243934, true }, + { 243953, true }, + { 243965, true }, + { 243972, true }, { 243988, true }, - { 244004, true }, - { 244014, true }, + { 244010, true }, { 244021, true }, - { 244028, true }, - { 244040, true }, - { 244051, true }, - { 244061, true }, - { 244073, true }, - { 244083, false }, - { 244103, false }, - { 244126, true }, - { 244150, true }, - { 244160, false }, - { 244167, true }, - { 244178, true }, - { 244190, true }, - { 244203, true }, - { 244217, true }, - { 244231, true }, - { 244244, true }, - { 244255, true }, - { 244271, false }, - { 244292, true }, - { 244302, true }, - { 244313, true }, - { 244328, true }, - { 244342, true }, - { 244353, true }, - { 244367, true }, - { 244387, true }, - { 244401, true }, - { 244410, true }, - { 244421, true }, - { 244436, true }, + { 244036, true }, + { 244059, true }, + { 244066, true }, + { 244076, true }, + { 244087, true }, + { 244097, true }, + { 244109, true }, + { 244125, true }, + { 244135, true }, + { 244142, true }, + { 244149, true }, + { 244161, true }, + { 244172, true }, + { 244182, true }, + { 244194, true }, + { 244204, false }, + { 244224, false }, + { 244247, true }, + { 244271, true }, + { 244281, false }, + { 244288, true }, + { 244299, true }, + { 244311, true }, + { 244324, true }, + { 244338, true }, + { 244352, true }, + { 244365, true }, + { 244376, true }, + { 244392, false }, + { 244413, true }, + { 244423, true }, + { 244434, true }, { 244449, true }, - { 244462, true }, - { 244477, true }, - { 244493, true }, - { 244507, true }, + { 244463, true }, + { 244474, true }, + { 244488, true }, + { 244508, true }, { 244522, true }, - { 244536, true }, - { 244552, true }, - { 244566, true }, - { 244580, true }, + { 244531, true }, + { 244542, true }, + { 244557, true }, + { 244570, true }, + { 244583, true }, { 244598, true }, - { 244616, true }, - { 244636, true }, - { 244655, true }, - { 244671, true }, - { 244686, true }, - { 244700, true }, - { 244720, true }, - { 244736, true }, - { 244751, true }, - { 244765, true }, - { 244781, true }, + { 244614, true }, + { 244628, true }, + { 244643, true }, + { 244657, true }, + { 244673, true }, + { 244687, true }, + { 244701, true }, + { 244719, true }, + { 244737, true }, + { 244757, true }, + { 244776, true }, { 244792, true }, - { 244802, false }, - { 244826, true }, - { 244840, true }, - { 244855, true }, - { 244869, true }, - { 244879, true }, - { 244897, true }, - { 244914, true }, - { 244927, true }, - { 244940, true }, - { 244957, true }, - { 244974, false }, - { 244991, true }, - { 245004, true }, - { 245021, true }, - { 245034, true }, - { 245047, true }, - { 245067, true }, - { 245085, true }, - { 245095, true }, - { 245108, true }, - { 245122, true }, - { 245136, false }, - { 245147, true }, - { 245164, true }, - { 245178, true }, - { 245197, true }, - { 245220, true }, - { 245248, true }, - { 245264, true }, - { 245276, true }, - { 245290, false }, - { 245303, true }, - { 245317, true }, - { 245330, true }, - { 245340, true }, - { 245349, true }, - { 245361, true }, - { 245374, true }, - { 245387, true }, - { 245403, true }, - { 245413, true }, - { 245428, true }, - { 245436, true }, - { 245447, true }, - { 245462, true }, - { 245479, true }, - { 245486, true }, - { 245496, true }, - { 245506, true }, - { 245527, true }, - { 245543, true }, - { 245562, true }, - { 245582, true }, - { 245597, true }, - { 245605, true }, - { 245624, true }, - { 245635, true }, - { 245651, true }, - { 245666, true }, - { 245676, true }, - { 245684, true }, - { 245695, true }, - { 245708, true }, - { 245719, true }, - { 245734, false }, - { 245754, true }, - { 245769, true }, - { 245791, true }, - { 245801, true }, + { 244807, true }, + { 244821, true }, + { 244841, true }, + { 244857, true }, + { 244872, true }, + { 244886, true }, + { 244902, true }, + { 244913, true }, + { 244923, false }, + { 244947, true }, + { 244961, true }, + { 244976, true }, + { 244990, true }, + { 245000, true }, + { 245018, true }, + { 245035, true }, + { 245048, true }, + { 245061, true }, + { 245078, true }, + { 245095, false }, + { 245112, true }, + { 245125, true }, + { 245142, true }, + { 245155, true }, + { 245168, true }, + { 245188, true }, + { 245206, true }, + { 245216, true }, + { 245229, true }, + { 245243, true }, + { 245257, false }, + { 245268, true }, + { 245285, true }, + { 245299, true }, + { 245318, true }, + { 245341, true }, + { 245369, true }, + { 245385, true }, + { 245397, true }, + { 245411, false }, + { 245424, true }, + { 245438, true }, + { 245451, true }, + { 245461, true }, + { 245470, true }, + { 245482, true }, + { 245495, true }, + { 245508, true }, + { 245524, true }, + { 245534, true }, + { 245549, true }, + { 245557, true }, + { 245568, true }, + { 245583, true }, + { 245600, true }, + { 245607, true }, + { 245617, true }, + { 245627, true }, + { 245648, true }, + { 245664, true }, + { 245683, true }, + { 245703, true }, + { 245718, true }, + { 245726, true }, + { 245745, true }, + { 245756, true }, + { 245772, true }, + { 245787, true }, + { 245797, true }, + { 245805, true }, { 245816, true }, { 245829, true }, { 245840, true }, - { 245850, true }, - { 245862, true }, - { 245886, true }, - { 245899, true }, + { 245855, false }, + { 245875, true }, + { 245890, true }, { 245912, true }, - { 245924, true }, - { 245938, true }, - { 245949, true }, - { 245966, true }, - { 245982, true }, - { 245998, true }, - { 246014, true }, + { 245922, true }, + { 245937, true }, + { 245950, true }, + { 245961, true }, + { 245971, true }, + { 245983, true }, + { 246007, true }, + { 246020, true }, { 246033, true }, - { 246053, true }, - { 246064, true }, - { 246074, true }, - { 246085, true }, - { 246093, false }, - { 246100, true }, - { 246113, true }, - { 246124, true }, - { 246134, true }, - { 246148, true }, - { 246163, true }, - { 246173, true }, - { 246191, true }, - { 246205, true }, - { 246224, true }, - { 246236, true }, - { 246263, false }, - { 246272, true }, - { 246285, false }, - { 246308, true }, - { 246319, true }, + { 246045, true }, + { 246059, true }, + { 246070, true }, + { 246087, true }, + { 246103, true }, + { 246119, true }, + { 246135, true }, + { 246154, true }, + { 246174, true }, + { 246185, true }, + { 246195, true }, + { 246206, true }, + { 246214, false }, + { 246221, true }, + { 246234, true }, + { 246245, true }, + { 246255, true }, + { 246269, true }, + { 246284, true }, + { 246294, true }, + { 246312, true }, { 246326, true }, - { 246333, true }, - { 246344, true }, + { 246345, true }, { 246357, true }, - { 246373, true }, - { 246386, true }, - { 246398, true }, - { 246416, true }, - { 246426, true }, - { 246443, true }, - { 246458, true }, - { 246467, true }, + { 246384, false }, + { 246393, true }, + { 246406, false }, + { 246429, true }, + { 246440, true }, + { 246447, true }, + { 246454, true }, + { 246465, true }, { 246478, true }, - { 246489, true }, + { 246494, true }, { 246507, true }, - { 246521, true }, - { 246533, false }, - { 246542, true }, - { 246552, true }, + { 246519, true }, + { 246537, true }, + { 246547, true }, { 246564, true }, - { 246576, true }, - { 246589, true }, - { 246605, true }, - { 246624, true }, - { 246643, true }, - { 246658, true }, - { 246668, true }, - { 246687, true }, - { 246705, true }, - { 246717, true }, - { 246736, true }, - { 246744, false }, - { 246759, true }, - { 246766, true }, - { 246778, true }, - { 246787, true }, - { 246802, true }, - { 246811, true }, - { 246822, false }, - { 246832, true }, - { 246841, true }, - { 246850, true }, - { 246858, true }, - { 246864, true }, - { 246883, true }, - { 246896, true }, - { 246918, true }, - { 246936, true }, - { 246949, true }, - { 246965, true }, - { 246974, true }, - { 246984, true }, - { 247000, true }, - { 247012, true }, - { 247023, true }, + { 246579, true }, + { 246588, true }, + { 246599, true }, + { 246610, true }, + { 246628, true }, + { 246642, true }, + { 246654, false }, + { 246663, true }, + { 246673, true }, + { 246685, true }, + { 246697, true }, + { 246710, true }, + { 246726, true }, + { 246745, true }, + { 246764, true }, + { 246779, true }, + { 246789, true }, + { 246807, true }, + { 246819, true }, + { 246838, true }, + { 246846, false }, + { 246861, true }, + { 246868, true }, + { 246880, true }, + { 246889, true }, + { 246904, true }, + { 246913, true }, + { 246924, false }, + { 246934, true }, + { 246943, true }, + { 246952, true }, + { 246960, true }, + { 246966, true }, + { 246985, true }, + { 246998, true }, + { 247020, true }, { 247038, true }, - { 247052, true }, + { 247051, true }, { 247067, true }, - { 247085, true }, - { 247097, true }, - { 247107, true }, - { 247131, true }, - { 247151, true }, - { 247172, true }, - { 247185, true }, - { 247201, true }, - { 247213, true }, - { 247227, true }, - { 247244, true }, - { 247263, true }, - { 247273, true }, - { 247295, true }, - { 247310, true }, - { 247324, true }, - { 247337, true }, + { 247076, true }, + { 247086, true }, + { 247102, true }, + { 247114, true }, + { 247125, true }, + { 247140, true }, + { 247154, true }, + { 247169, true }, + { 247187, true }, + { 247199, true }, + { 247209, true }, + { 247233, true }, + { 247253, true }, + { 247274, true }, + { 247287, true }, + { 247303, true }, + { 247315, true }, + { 247329, true }, { 247346, true }, - { 247357, true }, - { 247370, true }, - { 247381, true }, - { 247395, true }, - { 247410, true }, - { 247424, true }, + { 247365, true }, + { 247375, true }, + { 247397, true }, + { 247412, true }, + { 247426, true }, { 247439, true }, - { 247462, false }, - { 247475, true }, - { 247487, true }, - { 247501, true }, - { 247516, true }, - { 247525, true }, - { 247537, true }, - { 247547, true }, - { 247561, true }, - { 247574, true }, - { 247587, true }, - { 247606, true }, - { 247620, true }, - { 247632, true }, - { 247644, true }, - { 247660, true }, - { 247678, true }, - { 247704, true }, - { 247722, false }, - { 247735, true }, - { 247753, true }, - { 247763, true }, - { 247773, true }, - { 247790, true }, - { 247801, true }, - { 247816, true }, - { 247832, true }, - { 247840, true }, - { 247850, true }, - { 247860, true }, - { 247870, true }, - { 247882, true }, + { 247448, true }, + { 247459, true }, + { 247472, true }, + { 247483, true }, + { 247497, true }, + { 247512, true }, + { 247526, true }, + { 247541, true }, + { 247564, false }, + { 247577, true }, + { 247589, true }, + { 247603, true }, + { 247618, true }, + { 247627, true }, + { 247639, true }, + { 247649, true }, + { 247663, true }, + { 247676, true }, + { 247689, true }, + { 247708, true }, + { 247722, true }, + { 247734, true }, + { 247746, true }, + { 247762, true }, + { 247780, true }, + { 247806, true }, + { 247824, false }, + { 247837, true }, + { 247855, true }, + { 247865, true }, + { 247875, true }, { 247892, true }, - { 247902, true }, - { 247913, true }, - { 247933, true }, - { 247941, false }, + { 247903, true }, + { 247918, true }, + { 247934, true }, + { 247942, true }, + { 247952, true }, { 247962, true }, - { 247975, true }, + { 247972, true }, { 247984, true }, - { 247998, true }, - { 248008, true }, - { 248021, true }, - { 248037, true }, - { 248048, false }, - { 248068, true }, - { 248078, true }, - { 248085, true }, - { 248095, true }, - { 248105, true }, - { 248120, true }, - { 248134, true }, - { 248151, true }, - { 248168, true }, - { 248188, true }, - { 248201, true }, - { 248219, true }, - { 248235, true }, - { 248244, true }, - { 248274, true }, - { 248300, true }, - { 248320, true }, - { 248328, true }, - { 248347, true }, - { 248361, true }, - { 248370, true }, - { 248385, true }, - { 248410, true }, - { 248429, true }, - { 248439, true }, - { 248460, true }, + { 247994, true }, + { 248004, true }, + { 248015, true }, + { 248035, true }, + { 248043, false }, + { 248064, true }, + { 248077, true }, + { 248086, true }, + { 248100, true }, + { 248110, true }, + { 248123, true }, + { 248139, true }, + { 248150, false }, + { 248170, true }, + { 248180, true }, + { 248187, true }, + { 248197, true }, + { 248207, true }, + { 248222, true }, + { 248236, true }, + { 248253, true }, + { 248270, true }, + { 248290, true }, + { 248303, true }, + { 248321, true }, + { 248337, true }, + { 248346, true }, + { 248376, true }, + { 248402, true }, + { 248422, true }, + { 248430, true }, + { 248449, true }, + { 248463, true }, { 248472, true }, { 248487, true }, - { 248500, true }, - { 248516, true }, - { 248528, true }, - { 248545, true }, - { 248556, true }, - { 248573, true }, - { 248591, true }, - { 248607, true }, - { 248627, true }, - { 248649, true }, - { 248662, true }, - { 248672, true }, - { 248694, true }, - { 248715, true }, - { 248734, true }, - { 248755, true }, - { 248768, true }, - { 248792, true }, - { 248803, true }, - { 248815, true }, - { 248827, true }, - { 248849, true }, - { 248859, true }, - { 248877, true }, - { 248889, false }, - { 248906, true }, - { 248938, true }, - { 248949, true }, - { 248959, true }, - { 248972, true }, - { 248981, true }, - { 248994, true }, - { 249005, true }, - { 249016, true }, - { 249026, true }, - { 249033, true }, - { 249044, true }, - { 249058, true }, - { 249071, false }, + { 248512, true }, + { 248531, true }, + { 248541, true }, + { 248562, true }, + { 248574, true }, + { 248589, true }, + { 248602, true }, + { 248618, true }, + { 248630, true }, + { 248647, true }, + { 248658, true }, + { 248675, true }, + { 248693, true }, + { 248709, true }, + { 248729, true }, + { 248751, true }, + { 248764, true }, + { 248774, true }, + { 248796, true }, + { 248817, true }, + { 248836, true }, + { 248857, true }, + { 248870, true }, + { 248894, true }, + { 248905, true }, + { 248917, true }, + { 248929, true }, + { 248951, true }, + { 248961, true }, + { 248979, true }, + { 248991, false }, + { 249008, true }, + { 249040, true }, + { 249051, true }, + { 249061, true }, + { 249074, true }, { 249083, true }, - { 249103, true }, - { 249116, true }, - { 249126, true }, - { 249139, true }, + { 249096, true }, + { 249107, true }, + { 249118, true }, + { 249128, true }, + { 249135, true }, + { 249146, true }, { 249160, true }, - { 249170, true }, - { 249187, true }, - { 249201, true }, + { 249173, false }, + { 249185, true }, + { 249205, true }, { 249218, true }, - { 249236, true }, - { 249243, true }, - { 249261, false }, - { 249279, false }, - { 249297, false }, - { 249314, true }, - { 249336, true }, - { 249349, true }, - { 249362, false }, - { 249376, true }, - { 249391, true }, - { 249403, true }, - { 249424, true }, - { 249442, true }, - { 249457, true }, - { 249482, true }, - { 249500, true }, - { 249516, true }, + { 249228, true }, + { 249241, true }, + { 249262, true }, + { 249272, true }, + { 249289, true }, + { 249303, true }, + { 249320, true }, + { 249338, true }, + { 249345, true }, + { 249363, false }, + { 249381, false }, + { 249399, false }, + { 249416, true }, + { 249438, true }, + { 249451, true }, + { 249464, false }, + { 249478, true }, + { 249493, true }, + { 249505, true }, + { 249526, true }, { 249544, true }, { 249559, true }, - { 249570, true }, - { 249593, false }, - { 249611, true }, - { 249626, true }, - { 249638, true }, - { 249651, true }, - { 249680, true }, - { 249698, true }, - { 249721, true }, + { 249584, true }, + { 249602, true }, + { 249618, true }, + { 249646, true }, + { 249661, true }, + { 249672, true }, + { 249695, false }, + { 249713, true }, + { 249728, true }, { 249740, true }, - { 249757, true }, - { 249767, true }, + { 249753, true }, { 249782, true }, - { 249793, true }, - { 249817, true }, - { 249828, false }, - { 249843, true }, - { 249858, true }, - { 249876, true }, - { 249890, true }, - { 249905, true }, - { 249918, true }, - { 249930, true }, - { 249953, true }, - { 249967, true }, - { 249990, true }, - { 250015, true }, - { 250027, true }, - { 250043, true }, - { 250067, true }, - { 250085, true }, - { 250099, true }, - { 250110, true }, - { 250128, true }, - { 250152, false }, - { 250175, true }, - { 250195, true }, - { 250213, true }, - { 250233, true }, - { 250243, true }, - { 250256, true }, - { 250267, true }, - { 250280, true }, + { 249800, true }, + { 249823, true }, + { 249842, true }, + { 249859, true }, + { 249869, true }, + { 249884, true }, + { 249895, true }, + { 249919, true }, + { 249930, false }, + { 249945, true }, + { 249960, true }, + { 249978, true }, + { 249992, true }, + { 250007, true }, + { 250020, true }, + { 250032, true }, + { 250055, true }, + { 250069, true }, + { 250092, true }, + { 250117, true }, + { 250129, true }, + { 250145, true }, + { 250169, true }, + { 250187, true }, + { 250201, true }, + { 250212, true }, + { 250230, true }, + { 250254, false }, + { 250277, true }, { 250297, true }, - { 250308, true }, - { 250319, true }, - { 250341, true }, - { 250359, false }, - { 250373, true }, - { 250387, true }, - { 250405, true }, - { 250425, true }, - { 250439, true }, - { 250448, true }, - { 250464, true }, - { 250482, true }, - { 250497, true }, - { 250512, true }, - { 250525, true }, - { 250537, true }, - { 250549, true }, - { 250560, true }, - { 250571, true }, + { 250315, true }, + { 250335, true }, + { 250345, true }, + { 250358, true }, + { 250369, true }, + { 250382, true }, + { 250399, true }, + { 250410, true }, + { 250421, true }, + { 250443, true }, + { 250461, false }, + { 250475, true }, + { 250489, true }, + { 250507, true }, + { 250527, true }, + { 250541, true }, + { 250550, true }, + { 250566, true }, { 250584, true }, - { 250597, true }, - { 250611, true }, - { 250622, true }, - { 250633, true }, - { 250646, true }, - { 250660, true }, - { 250670, true }, - { 250679, true }, - { 250696, true }, - { 250706, true }, - { 250716, true }, - { 250729, true }, + { 250599, true }, + { 250614, true }, + { 250627, true }, + { 250639, true }, + { 250651, true }, + { 250662, true }, + { 250673, true }, + { 250686, true }, + { 250699, true }, + { 250713, true }, + { 250724, true }, { 250738, true }, - { 250748, true }, - { 250759, true }, - { 250769, true }, - { 250777, true }, - { 250785, false }, - { 250799, true }, - { 250807, false }, - { 250827, true }, - { 250837, true }, - { 250851, true }, - { 250865, true }, + { 250749, true }, + { 250762, true }, + { 250776, true }, + { 250786, true }, + { 250795, true }, + { 250812, true }, + { 250822, true }, + { 250832, true }, + { 250845, true }, + { 250854, true }, + { 250864, true }, { 250875, true }, - { 250886, true }, - { 250898, true }, - { 250909, true }, - { 250921, true }, - { 250931, true }, - { 250940, true }, - { 250951, true }, - { 250964, true }, - { 250976, true }, - { 250988, true }, - { 251000, true }, - { 251011, true }, - { 251025, false }, - { 251041, true }, - { 251057, true }, - { 251072, true }, - { 251086, true }, - { 251095, true }, - { 251107, true }, - { 251117, true }, - { 251133, true }, - { 251148, true }, - { 251163, true }, - { 251179, true }, - { 251194, true }, - { 251209, true }, - { 251231, true }, - { 251243, true }, - { 251250, true }, - { 251265, true }, - { 251276, true }, - { 251286, true }, - { 251301, true }, - { 251315, true }, - { 251329, true }, - { 251340, true }, - { 251353, true }, - { 251364, true }, - { 251374, false }, - { 251389, true }, - { 251405, true }, - { 251414, true }, - { 251424, true }, - { 251431, true }, - { 251442, true }, - { 251454, true }, - { 251476, true }, - { 251488, true }, - { 251500, true }, - { 251514, true }, - { 251537, true }, - { 251584, true }, - { 251619, true }, - { 251655, true }, - { 251692, true }, - { 251725, true }, - { 251763, true }, - { 251798, true }, - { 251833, true }, - { 251873, true }, - { 251909, true }, - { 251952, true }, - { 251978, true }, - { 251991, true }, - { 252000, true }, - { 252010, true }, - { 252020, true }, - { 252047, true }, - { 252056, true }, - { 252065, true }, - { 252082, true }, - { 252099, true }, - { 252111, true }, - { 252124, true }, - { 252137, true }, - { 252164, true }, - { 252171, true }, - { 252183, true }, - { 252194, true }, - { 252203, true }, - { 252220, true }, - { 252236, true }, - { 252247, true }, - { 252259, true }, - { 252272, true }, - { 252296, true }, - { 252308, true }, - { 252319, true }, - { 252327, true }, - { 252337, true }, - { 252344, true }, - { 252364, true }, - { 252376, true }, - { 252394, true }, - { 252406, true }, - { 252417, true }, - { 252429, true }, - { 252439, true }, - { 252451, true }, - { 252471, true }, - { 252493, true }, - { 252502, true }, - { 252510, true }, - { 252519, true }, - { 252528, true }, - { 252547, true }, - { 252561, true }, - { 252582, true }, - { 252595, true }, - { 252607, true }, - { 252635, true }, - { 252659, true }, - { 252671, true }, + { 250885, true }, + { 250893, true }, + { 250901, false }, + { 250915, true }, + { 250923, false }, + { 250943, true }, + { 250953, true }, + { 250967, true }, + { 250981, true }, + { 250991, true }, + { 251002, true }, + { 251014, true }, + { 251025, true }, + { 251037, true }, + { 251047, true }, + { 251056, true }, + { 251067, true }, + { 251080, true }, + { 251092, true }, + { 251104, true }, + { 251116, true }, + { 251127, true }, + { 251141, false }, + { 251157, true }, + { 251173, true }, + { 251188, true }, + { 251202, true }, + { 251211, true }, + { 251223, true }, + { 251233, true }, + { 251249, true }, + { 251264, true }, + { 251279, true }, + { 251295, true }, + { 251310, true }, + { 251325, true }, + { 251337, true }, + { 251344, true }, + { 251359, true }, + { 251370, true }, + { 251380, true }, + { 251395, true }, + { 251409, true }, + { 251423, true }, + { 251434, true }, + { 251447, true }, + { 251458, true }, + { 251468, false }, + { 251483, true }, + { 251499, true }, + { 251508, true }, + { 251518, true }, + { 251525, true }, + { 251536, true }, + { 251548, true }, + { 251570, true }, + { 251582, true }, + { 251594, true }, + { 251608, true }, + { 251631, true }, + { 251678, true }, + { 251713, true }, + { 251749, true }, + { 251786, true }, + { 251819, true }, + { 251857, true }, + { 251892, true }, + { 251927, true }, + { 251967, true }, + { 252003, true }, + { 252046, true }, + { 252072, true }, + { 252085, true }, + { 252094, true }, + { 252104, true }, + { 252114, true }, + { 252141, true }, + { 252150, true }, + { 252159, true }, + { 252176, true }, + { 252193, true }, + { 252205, true }, + { 252218, true }, + { 252231, true }, + { 252258, true }, + { 252265, true }, + { 252277, true }, + { 252288, true }, + { 252297, true }, + { 252314, true }, + { 252330, true }, + { 252341, true }, + { 252353, true }, + { 252366, true }, + { 252390, true }, + { 252402, true }, + { 252413, true }, + { 252421, true }, + { 252431, true }, + { 252438, true }, + { 252458, true }, + { 252470, true }, + { 252488, true }, + { 252500, true }, + { 252511, true }, + { 252523, true }, + { 252533, true }, + { 252545, true }, + { 252565, true }, + { 252587, true }, + { 252596, true }, + { 252604, true }, + { 252613, true }, + { 252622, true }, + { 252641, true }, + { 252655, true }, + { 252676, true }, { 252689, true }, - { 252707, false }, - { 252721, true }, - { 252736, true }, - { 252751, true }, - { 252760, true }, - { 252777, true }, - { 252798, true }, - { 252808, true }, - { 252822, true }, + { 252701, true }, + { 252729, true }, + { 252753, true }, + { 252765, true }, + { 252783, true }, + { 252801, false }, + { 252815, true }, { 252830, true }, { 252845, true }, - { 252861, true }, - { 252877, true }, - { 252900, true }, - { 252910, true }, - { 252920, true }, - { 252936, true }, - { 252947, true }, - { 252958, true }, - { 252970, true }, - { 252981, true }, + { 252854, true }, + { 252871, true }, + { 252892, true }, + { 252902, true }, + { 252916, true }, + { 252924, true }, + { 252939, true }, + { 252955, true }, + { 252971, true }, { 252994, true }, - { 253008, true }, - { 253025, false }, + { 253004, true }, + { 253014, true }, + { 253030, true }, { 253041, true }, - { 253057, true }, - { 253069, false }, + { 253052, true }, + { 253064, true }, + { 253075, true }, { 253088, true }, - { 253098, true }, - { 253116, true }, - { 253131, true }, - { 253153, true }, - { 253176, true }, - { 253187, true }, - { 253197, true }, - { 253214, true }, - { 253224, true }, - { 253240, true }, - { 253259, true }, - { 253274, true }, - { 253290, true }, - { 253307, true }, - { 253327, true }, - { 253344, true }, - { 253356, true }, - { 253371, true }, - { 253385, true }, - { 253404, true }, - { 253420, true }, - { 253429, true }, - { 253445, true }, - { 253462, true }, - { 253474, true }, - { 253486, true }, - { 253495, true }, - { 253505, true }, - { 253522, true }, - { 253540, true }, - { 253551, true }, - { 253559, true }, - { 253569, true }, - { 253584, true }, - { 253594, true }, - { 253604, false }, + { 253102, true }, + { 253119, false }, + { 253135, true }, + { 253151, true }, + { 253163, false }, + { 253182, true }, + { 253192, true }, + { 253210, true }, + { 253225, true }, + { 253247, true }, + { 253270, true }, + { 253281, true }, + { 253291, true }, + { 253308, true }, + { 253318, true }, + { 253334, true }, + { 253353, true }, + { 253368, true }, + { 253384, true }, + { 253401, true }, + { 253421, true }, + { 253438, true }, + { 253450, true }, + { 253465, true }, + { 253479, true }, + { 253498, true }, + { 253514, true }, + { 253523, true }, + { 253539, true }, + { 253556, false }, + { 253568, true }, + { 253580, true }, + { 253592, true }, + { 253601, true }, { 253611, true }, - { 253621, true }, - { 253637, true }, - { 253653, true }, - { 253674, true }, - { 253694, true }, + { 253628, true }, + { 253646, true }, + { 253657, true }, + { 253665, true }, + { 253675, true }, + { 253690, true }, + { 253700, true }, + { 253710, false }, { 253717, true }, - { 253737, true }, - { 253752, true }, - { 253770, true }, - { 253781, false }, - { 253805, true }, - { 253824, true }, - { 253837, true }, - { 253853, true }, - { 253867, true }, - { 253879, true }, - { 253891, true }, - { 253902, true }, - { 253912, false }, - { 253926, false }, - { 253939, true }, - { 253953, true }, - { 253971, true }, - { 253994, true }, - { 254012, true }, - { 254025, true }, - { 254037, true }, - { 254048, true }, + { 253727, true }, + { 253743, true }, + { 253759, true }, + { 253780, true }, + { 253800, true }, + { 253823, true }, + { 253843, true }, + { 253858, true }, + { 253876, true }, + { 253887, false }, + { 253911, true }, + { 253930, true }, + { 253943, true }, + { 253959, true }, + { 253973, true }, + { 253985, true }, + { 253997, true }, + { 254008, true }, + { 254018, false }, + { 254032, false }, + { 254045, true }, { 254059, true }, - { 254074, true }, - { 254088, true }, - { 254113, true }, - { 254146, true }, - { 254172, true }, - { 254206, true }, - { 254229, true }, - { 254242, true }, - { 254255, true }, - { 254271, true }, - { 254288, true }, - { 254305, true }, - { 254317, true }, - { 254329, true }, - { 254345, false }, - { 254365, true }, - { 254378, false }, - { 254396, false }, - { 254419, true }, - { 254439, true }, - { 254455, true }, - { 254469, true }, - { 254490, true }, - { 254505, false }, - { 254518, true }, - { 254533, true }, - { 254550, true }, - { 254564, true }, - { 254577, true }, - { 254589, true }, - { 254601, true }, - { 254617, true }, - { 254632, false }, - { 254654, true }, - { 254674, true }, - { 254690, false }, - { 254702, true }, - { 254718, true }, - { 254736, true }, - { 254748, true }, - { 254762, true }, - { 254776, true }, - { 254793, true }, - { 254810, true }, + { 254077, true }, + { 254100, true }, + { 254118, true }, + { 254131, true }, + { 254143, true }, + { 254154, true }, + { 254165, true }, + { 254180, true }, + { 254194, true }, + { 254219, true }, + { 254252, true }, + { 254278, true }, + { 254312, true }, + { 254335, true }, + { 254348, true }, + { 254361, true }, + { 254377, true }, + { 254394, true }, + { 254411, true }, + { 254423, true }, + { 254435, true }, + { 254451, false }, + { 254471, true }, + { 254484, false }, + { 254502, false }, + { 254525, true }, + { 254545, true }, + { 254561, true }, + { 254575, true }, + { 254596, true }, + { 254611, false }, + { 254624, true }, + { 254639, true }, + { 254656, true }, + { 254670, true }, + { 254683, true }, + { 254695, true }, + { 254707, true }, + { 254723, true }, + { 254738, false }, + { 254760, true }, + { 254780, true }, + { 254796, false }, + { 254808, true }, { 254824, true }, - { 254834, false }, - { 254848, true }, - { 254858, true }, + { 254842, true }, + { 254854, true }, { 254868, true }, - { 254889, true }, - { 254902, true }, - { 254920, true }, - { 254936, true }, - { 254949, true }, - { 254960, true }, - { 254973, true }, - { 254994, true }, - { 255007, true }, - { 255027, true }, - { 255044, true }, - { 255056, true }, - { 255070, true }, - { 255080, true }, - { 255097, true }, - { 255107, true }, - { 255135, true }, - { 255144, true }, - { 255154, true }, - { 255172, true }, - { 255180, true }, - { 255196, true }, - { 255212, true }, - { 255228, true }, - { 255249, true }, - { 255262, true }, - { 255287, true }, + { 254882, true }, + { 254899, true }, + { 254916, true }, + { 254930, true }, + { 254940, false }, + { 254954, true }, + { 254964, true }, + { 254974, true }, + { 254995, true }, + { 255008, true }, + { 255026, true }, + { 255042, true }, + { 255055, true }, + { 255066, true }, + { 255079, true }, + { 255100, true }, + { 255113, true }, + { 255133, true }, + { 255150, true }, + { 255162, true }, + { 255176, true }, + { 255186, true }, + { 255203, true }, + { 255213, true }, + { 255241, true }, + { 255250, true }, + { 255260, true }, + { 255278, true }, + { 255286, true }, { 255302, true }, - { 255314, true }, + { 255318, true }, { 255334, true }, - { 255348, true }, - { 255363, true }, - { 255385, true }, - { 255407, true }, - { 255427, true }, - { 255442, true }, - { 255455, true }, - { 255473, true }, - { 255488, true }, - { 255504, true }, - { 255520, true }, - { 255536, true }, - { 255560, true }, - { 255571, true }, - { 255580, true }, - { 255588, false }, - { 255598, true }, + { 255355, true }, + { 255368, true }, + { 255393, true }, + { 255408, true }, + { 255420, true }, + { 255440, true }, + { 255454, true }, + { 255469, true }, + { 255491, true }, + { 255513, true }, + { 255533, true }, + { 255548, true }, + { 255561, true }, + { 255579, true }, + { 255594, true }, { 255610, true }, - { 255627, true }, - { 255639, true }, - { 255655, true }, - { 255671, true }, - { 255688, true }, - { 255709, true }, - { 255721, true }, + { 255626, true }, + { 255642, true }, + { 255666, true }, + { 255677, true }, + { 255686, true }, + { 255694, false }, + { 255704, true }, + { 255716, true }, { 255733, true }, - { 255747, true }, - { 255766, false }, - { 255778, true }, - { 255790, true }, - { 255800, true }, + { 255745, true }, + { 255761, true }, + { 255777, true }, + { 255794, true }, { 255815, true }, { 255827, true }, - { 255841, true }, - { 255865, true }, - { 255877, true }, - { 255909, true }, - { 255924, true }, - { 255945, true }, - { 255976, true }, - { 255990, true }, + { 255839, true }, + { 255853, true }, + { 255872, false }, + { 255884, true }, + { 255896, true }, + { 255906, true }, + { 255921, true }, + { 255933, true }, + { 255947, true }, + { 255971, true }, + { 255983, true }, { 256015, true }, - { 256038, true }, - { 256049, true }, - { 256061, true }, - { 256076, true }, - { 256089, true }, - { 256102, true }, - { 256115, true }, - { 256125, true }, - { 256154, true }, - { 256177, true }, - { 256201, true }, - { 256228, true }, - { 256242, true }, - { 256265, true }, - { 256291, true }, - { 256319, true }, - { 256350, true }, - { 256375, true }, - { 256383, true }, - { 256390, true }, - { 256398, true }, - { 256407, true }, - { 256419, true }, - { 256441, true }, - { 256454, true }, - { 256475, true }, - { 256488, true }, - { 256509, true }, - { 256528, true }, - { 256549, true }, - { 256568, true }, - { 256579, true }, - { 256592, true }, - { 256604, true }, - { 256620, true }, - { 256634, false }, - { 256650, true }, - { 256658, true }, - { 256673, true }, - { 256690, true }, - { 256707, false }, - { 256722, true }, - { 256738, true }, - { 256748, true }, - { 256760, true }, - { 256776, true }, - { 256795, true }, - { 256809, false }, - { 256818, true }, - { 256830, true }, - { 256845, true }, - { 256858, true }, - { 256876, true }, - { 256887, true }, - { 256902, true }, - { 256915, true }, - { 256937, true }, - { 256954, true }, - { 256976, true }, - { 256998, true }, - { 257012, true }, - { 257026, true }, - { 257033, true }, - { 257046, true }, - { 257059, true }, - { 257076, true }, - { 257095, true }, - { 257121, true }, - { 257133, true }, - { 257161, true }, - { 257172, true }, - { 257198, true }, - { 257218, true }, - { 257239, true }, - { 257249, true }, - { 257259, false }, - { 257276, true }, + { 256030, true }, + { 256051, true }, + { 256082, true }, + { 256096, true }, + { 256121, true }, + { 256144, true }, + { 256155, true }, + { 256167, true }, + { 256182, true }, + { 256195, true }, + { 256208, true }, + { 256221, true }, + { 256231, true }, + { 256260, true }, + { 256283, true }, + { 256307, true }, + { 256334, true }, + { 256348, true }, + { 256371, true }, + { 256397, true }, + { 256425, true }, + { 256456, true }, + { 256481, true }, + { 256489, true }, + { 256496, true }, + { 256504, true }, + { 256513, true }, + { 256525, true }, + { 256547, true }, + { 256560, true }, + { 256581, true }, + { 256594, true }, + { 256615, true }, + { 256634, true }, + { 256655, true }, + { 256674, true }, + { 256685, true }, + { 256698, true }, + { 256710, true }, + { 256726, true }, + { 256740, false }, + { 256756, true }, + { 256764, true }, + { 256779, true }, + { 256796, true }, + { 256813, false }, + { 256828, true }, + { 256844, true }, + { 256854, true }, + { 256866, true }, + { 256885, true }, + { 256899, false }, + { 256908, true }, + { 256920, true }, + { 256935, true }, + { 256948, true }, + { 256966, true }, + { 256977, true }, + { 256992, true }, + { 257005, true }, + { 257027, true }, + { 257044, true }, + { 257066, true }, + { 257088, true }, + { 257102, true }, + { 257116, true }, + { 257123, true }, + { 257136, true }, + { 257149, true }, + { 257166, true }, + { 257185, true }, + { 257211, true }, + { 257223, true }, + { 257251, true }, + { 257262, true }, { 257288, true }, - { 257297, true }, - { 257310, true }, - { 257320, true }, - { 257334, true }, - { 257351, true }, - { 257363, true }, - { 257376, true }, - { 257394, true }, - { 257406, true }, - { 257417, true }, - { 257427, true }, - { 257440, false }, - { 257456, true }, - { 257472, true }, - { 257486, true }, - { 257499, false }, - { 257516, true }, - { 257530, true }, - { 257544, true }, - { 257558, true }, - { 257582, true }, - { 257595, true }, - { 257608, true }, - { 257622, true }, - { 257636, true }, - { 257651, true }, - { 257667, true }, - { 257682, true }, - { 257697, true }, - { 257715, true }, + { 257308, true }, + { 257329, true }, + { 257339, true }, + { 257349, false }, + { 257366, true }, + { 257378, true }, + { 257387, true }, + { 257400, true }, + { 257410, true }, + { 257424, true }, + { 257441, true }, + { 257453, true }, + { 257466, true }, + { 257484, true }, + { 257496, true }, + { 257507, true }, + { 257517, true }, + { 257530, false }, + { 257546, true }, + { 257562, true }, + { 257576, true }, + { 257589, false }, + { 257606, true }, + { 257620, true }, + { 257634, true }, + { 257648, true }, + { 257672, true }, + { 257685, true }, + { 257698, true }, + { 257712, true }, { 257726, true }, - { 257749, true }, - { 257761, true }, - { 257773, true }, - { 257785, true }, - { 257799, true }, - { 257818, true }, - { 257836, true }, - { 257852, true }, - { 257866, true }, - { 257881, true }, - { 257896, true }, - { 257920, true }, - { 257937, true }, - { 257955, true }, - { 257974, true }, - { 257994, true }, - { 258009, true }, + { 257741, true }, + { 257757, true }, + { 257772, true }, + { 257787, true }, + { 257805, true }, + { 257816, true }, + { 257839, true }, + { 257851, true }, + { 257863, true }, + { 257875, true }, + { 257889, true }, + { 257908, true }, + { 257926, true }, + { 257942, true }, + { 257956, true }, + { 257971, true }, + { 257986, true }, + { 258010, true }, { 258027, true }, - { 258039, true }, - { 258056, true }, - { 258070, true }, - { 258087, true }, - { 258096, true }, - { 258110, true }, - { 258119, true }, - { 258132, true }, - { 258144, true }, - { 258164, true }, - { 258178, true }, - { 258193, true }, - { 258211, true }, - { 258227, true }, - { 258244, true }, - { 258256, false }, - { 258269, true }, - { 258280, true }, - { 258301, true }, - { 258315, true }, - { 258328, true }, + { 258045, true }, + { 258064, true }, + { 258084, true }, + { 258099, true }, + { 258117, true }, + { 258129, true }, + { 258146, true }, + { 258160, true }, + { 258177, true }, + { 258186, true }, + { 258200, true }, + { 258209, true }, + { 258221, true }, + { 258241, true }, + { 258255, true }, + { 258270, true }, + { 258288, true }, + { 258304, true }, + { 258321, true }, + { 258333, false }, { 258346, true }, - { 258358, true }, - { 258370, true }, - { 258388, false }, - { 258407, true }, - { 258429, true }, - { 258444, true }, - { 258463, true }, - { 258477, false }, - { 258488, true }, - { 258503, true }, - { 258519, true }, + { 258357, true }, + { 258378, true }, + { 258392, true }, + { 258405, true }, + { 258423, true }, + { 258435, true }, + { 258447, true }, + { 258465, false }, + { 258484, true }, + { 258506, true }, + { 258521, true }, { 258540, true }, - { 258554, true }, - { 258566, true }, - { 258578, true }, - { 258595, true }, - { 258613, true }, - { 258624, true }, + { 258554, false }, + { 258565, true }, + { 258580, true }, + { 258596, true }, + { 258617, true }, { 258631, true }, { 258643, true }, - { 258657, true }, - { 258676, true }, - { 258686, true }, - { 258694, true }, - { 258704, true }, - { 258714, true }, - { 258729, true }, - { 258748, true }, - { 258764, false }, - { 258774, true }, + { 258655, true }, + { 258672, true }, + { 258690, true }, + { 258701, true }, + { 258708, true }, + { 258720, true }, + { 258734, true }, + { 258753, true }, + { 258763, true }, + { 258771, true }, { 258781, true }, - { 258792, false }, - { 258804, true }, - { 258813, true }, - { 258827, true }, - { 258839, true }, - { 258847, true }, - { 258854, true }, - { 258864, true }, - { 258876, true }, - { 258887, true }, - { 258906, true }, - { 258914, false }, - { 258926, true }, - { 258939, true }, - { 258954, true }, - { 258976, true }, - { 258990, true }, - { 259002, true }, - { 259020, true }, - { 259033, true }, - { 259049, true }, - { 259058, false }, - { 259075, true }, - { 259096, true }, - { 259107, true }, - { 259118, true }, - { 259132, true }, - { 259153, true }, - { 259165, true }, - { 259181, true }, - { 259206, true }, - { 259232, true }, + { 258791, true }, + { 258806, true }, + { 258825, true }, + { 258841, false }, + { 258851, true }, + { 258858, true }, + { 258869, false }, + { 258881, true }, + { 258890, true }, + { 258904, true }, + { 258916, true }, + { 258924, true }, + { 258931, true }, + { 258941, true }, + { 258953, true }, + { 258964, true }, + { 258983, true }, + { 258991, false }, + { 259003, true }, + { 259016, true }, + { 259031, true }, + { 259053, true }, + { 259067, true }, + { 259079, true }, + { 259097, true }, + { 259110, true }, + { 259126, true }, + { 259135, false }, + { 259152, true }, + { 259173, true }, + { 259184, true }, + { 259195, true }, + { 259209, true }, + { 259230, true }, + { 259242, true }, { 259258, true }, - { 259269, true }, - { 259279, true }, - { 259291, true }, - { 259304, true }, - { 259317, true }, - { 259327, true }, - { 259336, true }, - { 259350, true }, - { 259365, true }, + { 259283, true }, + { 259309, true }, + { 259335, true }, + { 259346, true }, + { 259356, true }, + { 259368, true }, { 259381, true }, - { 259401, true }, - { 259416, true }, - { 259426, true }, - { 259438, true }, + { 259394, true }, + { 259404, true }, + { 259413, true }, + { 259427, true }, + { 259442, true }, { 259458, true }, - { 259480, true }, + { 259478, true }, { 259493, true }, - { 259512, true }, - { 259526, true }, - { 259545, true }, + { 259503, true }, + { 259515, true }, + { 259535, true }, { 259557, true }, - { 259581, false }, - { 259595, true }, - { 259608, true }, - { 259621, true }, - { 259640, true }, - { 259662, true }, - { 259674, true }, - { 259689, true }, - { 259710, true }, - { 259735, true }, - { 259760, true }, - { 259776, true }, - { 259802, true }, - { 259830, true }, - { 259851, true }, - { 259870, true }, - { 259883, true }, - { 259899, true }, - { 259912, true }, - { 259924, true }, - { 259942, true }, - { 259956, true }, - { 259975, true }, - { 259986, true }, - { 259998, true }, - { 260008, true }, - { 260017, true }, - { 260031, true }, - { 260048, true }, - { 260059, true }, - { 260070, true }, - { 260078, true }, - { 260090, true }, - { 260104, true }, - { 260116, true }, - { 260129, false }, - { 260140, true }, - { 260157, true }, - { 260168, true }, - { 260177, false }, - { 260189, true }, - { 260208, true }, - { 260221, true }, - { 260232, true }, - { 260243, true }, - { 260254, true }, - { 260267, true }, - { 260278, true }, - { 260290, true }, - { 260300, true }, - { 260306, true }, - { 260316, true }, - { 260336, true }, - { 260346, true }, - { 260369, true }, - { 260394, true }, - { 260406, true }, - { 260425, true }, - { 260433, true }, - { 260441, true }, - { 260455, true }, - { 260467, true }, - { 260479, true }, - { 260494, false }, - { 260507, true }, - { 260520, true }, - { 260531, true }, - { 260542, true }, - { 260558, true }, - { 260568, true }, - { 260582, true }, - { 260592, true }, - { 260606, true }, - { 260613, true }, - { 260623, true }, - { 260636, true }, - { 260653, true }, - { 260663, true }, - { 260671, true }, - { 260686, true }, - { 260698, true }, - { 260714, true }, - { 260729, true }, - { 260739, true }, - { 260764, true }, - { 260776, true }, - { 260784, true }, - { 260796, false }, - { 260807, false }, - { 260825, false }, - { 260838, true }, + { 259570, true }, + { 259589, true }, + { 259603, true }, + { 259622, true }, + { 259634, true }, + { 259658, false }, + { 259672, true }, + { 259685, true }, + { 259698, true }, + { 259717, true }, + { 259739, true }, + { 259751, true }, + { 259766, true }, + { 259787, true }, + { 259812, true }, + { 259837, true }, + { 259853, true }, + { 259879, true }, + { 259907, true }, + { 259928, true }, + { 259947, true }, + { 259960, true }, + { 259976, true }, + { 259989, true }, + { 260001, true }, + { 260019, true }, + { 260033, true }, + { 260052, true }, + { 260063, true }, + { 260075, true }, + { 260085, true }, + { 260094, true }, + { 260108, true }, + { 260125, true }, + { 260136, true }, + { 260147, true }, + { 260155, true }, + { 260167, true }, + { 260181, true }, + { 260193, true }, + { 260206, false }, + { 260217, true }, + { 260234, true }, + { 260245, true }, + { 260254, false }, + { 260266, true }, + { 260285, true }, + { 260298, true }, + { 260309, true }, + { 260320, true }, + { 260331, true }, + { 260344, true }, + { 260355, true }, + { 260367, true }, + { 260377, true }, + { 260383, true }, + { 260393, true }, + { 260413, true }, + { 260423, true }, + { 260446, true }, + { 260471, true }, + { 260483, true }, + { 260502, true }, + { 260510, true }, + { 260518, true }, + { 260532, true }, + { 260544, true }, + { 260556, true }, + { 260571, false }, + { 260584, true }, + { 260597, true }, + { 260608, true }, + { 260619, true }, + { 260635, true }, + { 260645, true }, + { 260659, true }, + { 260669, true }, + { 260683, true }, + { 260690, true }, + { 260700, true }, + { 260713, true }, + { 260730, true }, + { 260740, true }, + { 260748, true }, + { 260763, true }, + { 260775, true }, + { 260791, true }, + { 260806, true }, + { 260816, true }, + { 260841, true }, { 260853, true }, - { 260867, true }, - { 260881, true }, - { 260898, true }, + { 260861, true }, + { 260873, false }, + { 260884, false }, + { 260902, false }, { 260915, true }, { 260930, true }, - { 260948, true }, - { 260966, true }, - { 260984, true }, - { 260998, true }, - { 261012, true }, - { 261026, true }, - { 261040, true }, - { 261054, false }, - { 261072, false }, - { 261095, false }, - { 261116, false }, - { 261135, true }, - { 261151, false }, - { 261167, false }, - { 261183, true }, - { 261205, true }, - { 261218, false }, - { 261235, false }, - { 261252, true }, - { 261269, false }, - { 261286, false }, - { 261300, false }, - { 261319, false }, - { 261330, false }, - { 261342, false }, - { 261354, false }, - { 261373, true }, - { 261391, false }, - { 261405, true }, - { 261421, false }, - { 261438, false }, - { 261455, false }, - { 261470, false }, - { 261486, true }, - { 261507, false }, - { 261526, false }, - { 261544, false }, - { 261564, true }, - { 261580, false }, - { 261595, true }, - { 261610, false }, - { 261634, true }, + { 260944, true }, + { 260958, true }, + { 260975, true }, + { 260992, true }, + { 261007, true }, + { 261025, true }, + { 261043, true }, + { 261061, true }, + { 261075, true }, + { 261089, true }, + { 261103, true }, + { 261117, true }, + { 261131, false }, + { 261149, false }, + { 261172, false }, + { 261193, false }, + { 261212, true }, + { 261228, false }, + { 261244, false }, + { 261260, true }, + { 261282, true }, + { 261295, false }, + { 261312, false }, + { 261329, true }, + { 261346, false }, + { 261363, false }, + { 261377, false }, + { 261396, false }, + { 261407, false }, + { 261419, false }, + { 261431, false }, + { 261450, true }, + { 261468, false }, + { 261482, true }, + { 261498, false }, + { 261515, false }, + { 261532, false }, + { 261547, false }, + { 261563, true }, + { 261584, false }, + { 261603, false }, + { 261621, false }, { 261641, true }, - { 261660, false }, - { 261678, false }, - { 261693, true }, - { 261713, true }, - { 261734, false }, - { 261758, false }, - { 261777, false }, - { 261793, false }, - { 261808, false }, - { 261821, true }, - { 261837, false }, - { 261852, false }, - { 261866, false }, - { 261884, true }, - { 261895, true }, - { 261906, true }, - { 261914, true }, - { 261922, true }, - { 261937, true }, - { 261947, true }, - { 261960, true }, - { 261977, true }, - { 261993, true }, - { 262007, true }, - { 262015, true }, - { 262026, true }, - { 262036, true }, + { 261657, false }, + { 261672, true }, + { 261687, false }, + { 261711, true }, + { 261718, true }, + { 261737, false }, + { 261755, false }, + { 261770, true }, + { 261790, true }, + { 261811, false }, + { 261835, false }, + { 261854, false }, + { 261870, false }, + { 261885, false }, + { 261898, true }, + { 261914, false }, + { 261929, false }, + { 261943, false }, + { 261961, true }, + { 261972, true }, + { 261983, true }, + { 261991, true }, + { 261999, true }, + { 262014, true }, + { 262024, true }, + { 262037, true }, { 262054, true }, { 262070, true }, - { 262075, true }, - { 262080, true }, - { 262088, true }, - { 262096, true }, - { 262116, true }, - { 262124, true }, - { 262133, true }, - { 262140, true }, - { 262159, true }, - { 262166, true }, - { 262173, true }, - { 262180, true }, - { 262189, true }, - { 262210, true }, - { 262230, true }, - { 262254, true }, - { 262264, true }, - { 262277, true }, - { 262294, true }, - { 262314, true }, - { 262320, true }, - { 262327, true }, - { 262339, true }, - { 262352, true }, - { 262363, true }, - { 262378, true }, - { 262391, false }, - { 262402, true }, + { 262084, true }, + { 262092, true }, + { 262103, true }, + { 262113, true }, + { 262131, true }, + { 262136, true }, + { 262141, true }, + { 262149, true }, + { 262157, true }, + { 262177, true }, + { 262185, true }, + { 262194, true }, + { 262201, true }, + { 262220, true }, + { 262227, true }, + { 262234, true }, + { 262241, true }, + { 262250, true }, + { 262271, true }, + { 262291, true }, + { 262315, true }, + { 262325, true }, + { 262338, true }, + { 262355, true }, + { 262375, true }, + { 262381, true }, + { 262388, true }, + { 262400, true }, { 262413, true }, - { 262421, false }, - { 262440, true }, - { 262451, true }, - { 262462, true }, - { 262469, true }, - { 262480, true }, - { 262491, true }, - { 262498, true }, - { 262509, true }, - { 262521, true }, - { 262540, true }, - { 262556, true }, - { 262568, true }, - { 262579, true }, - { 262595, true }, - { 262609, true }, - { 262624, true }, - { 262639, true }, - { 262649, true }, - { 262659, true }, - { 262670, false }, - { 262680, true }, - { 262690, true }, - { 262701, true }, - { 262709, true }, - { 262717, true }, - { 262727, true }, - { 262736, false }, - { 262750, true }, - { 262758, true }, - { 262768, true }, - { 262779, true }, - { 262787, true }, - { 262799, true }, - { 262810, true }, - { 262821, true }, - { 262833, true }, - { 262843, true }, - { 262851, true }, - { 262858, true }, - { 262865, true }, - { 262872, true }, - { 262897, true }, - { 262915, true }, - { 262941, true }, - { 262967, true }, - { 262978, true }, - { 262994, true }, - { 263024, true }, - { 263036, true }, + { 262424, true }, + { 262439, true }, + { 262452, false }, + { 262463, true }, + { 262474, true }, + { 262482, false }, + { 262501, true }, + { 262512, true }, + { 262523, true }, + { 262530, true }, + { 262541, true }, + { 262552, true }, + { 262559, true }, + { 262570, true }, + { 262582, true }, + { 262601, true }, + { 262617, true }, + { 262629, true }, + { 262640, true }, + { 262656, true }, + { 262670, true }, + { 262685, true }, + { 262700, true }, + { 262710, true }, + { 262720, true }, + { 262731, false }, + { 262741, true }, + { 262751, true }, + { 262762, true }, + { 262770, true }, + { 262778, true }, + { 262788, true }, + { 262797, false }, + { 262811, true }, + { 262819, true }, + { 262829, true }, + { 262840, true }, + { 262848, true }, + { 262860, true }, + { 262871, true }, + { 262882, true }, + { 262894, true }, + { 262904, true }, + { 262912, true }, + { 262919, true }, + { 262926, true }, + { 262933, true }, + { 262958, true }, + { 262976, true }, + { 263002, true }, + { 263028, true }, + { 263039, true }, { 263055, true }, - { 263079, true }, - { 263100, true }, - { 263126, true }, - { 263159, true }, - { 263182, true }, - { 263201, true }, - { 263229, true }, - { 263249, true }, - { 263267, true }, - { 263289, true }, - { 263314, true }, - { 263339, true }, - { 263379, true }, - { 263409, true }, - { 263420, true }, - { 263439, true }, + { 263085, true }, + { 263097, true }, + { 263116, true }, + { 263140, true }, + { 263161, true }, + { 263187, true }, + { 263220, true }, + { 263243, true }, + { 263262, true }, + { 263290, true }, + { 263310, true }, + { 263328, true }, + { 263350, true }, + { 263375, true }, + { 263400, true }, + { 263440, true }, { 263470, true }, - { 263481, false }, - { 263502, true }, - { 263520, true }, - { 263538, true }, - { 263556, true }, - { 263593, true }, - { 263621, true }, - { 263644, true }, - { 263672, true }, - { 263687, true }, - { 263714, true }, - { 263734, true }, - { 263755, true }, - { 263769, true }, - { 263786, true }, - { 263808, true }, - { 263833, true }, - { 263853, true }, - { 263872, true }, + { 263481, true }, + { 263500, true }, + { 263531, true }, + { 263542, false }, + { 263563, true }, + { 263581, true }, + { 263599, true }, + { 263617, true }, + { 263654, true }, + { 263682, true }, + { 263705, true }, + { 263733, true }, + { 263748, true }, + { 263775, true }, + { 263795, true }, + { 263816, true }, + { 263830, true }, + { 263847, true }, + { 263869, true }, + { 263894, true }, { 263914, true }, { 263933, true }, - { 263956, true }, - { 263972, true }, + { 263975, true }, { 263994, true }, - { 264028, true }, - { 264052, true }, - { 264059, true }, - { 264066, true }, - { 264077, true }, - { 264083, true }, - { 264094, true }, - { 264104, true }, + { 264017, true }, + { 264033, true }, + { 264055, true }, + { 264089, true }, + { 264113, true }, { 264120, true }, - { 264136, true }, - { 264146, true }, - { 264156, true }, - { 264163, true }, - { 264170, true }, + { 264127, true }, + { 264138, true }, + { 264144, true }, + { 264155, true }, + { 264171, true }, { 264187, true }, - { 264203, true }, - { 264216, true }, - { 264223, true }, + { 264197, true }, + { 264207, true }, + { 264214, true }, + { 264221, true }, { 264238, true }, - { 264252, true }, - { 264261, true }, - { 264275, true }, - { 264285, true }, - { 264295, true }, - { 264308, true }, - { 264321, true }, - { 264328, true }, - { 264335, true }, - { 264344, true }, - { 264351, true }, - { 264362, true }, - { 264371, true }, - { 264382, true }, - { 264398, true }, - { 264407, true }, - { 264420, false }, - { 264427, true }, - { 264437, true }, - { 264445, true }, - { 264456, true }, - { 264468, true }, - { 264478, true }, + { 264254, true }, + { 264267, true }, + { 264274, true }, + { 264289, true }, + { 264303, true }, + { 264312, true }, + { 264322, true }, + { 264332, true }, + { 264345, true }, + { 264358, true }, + { 264365, true }, + { 264372, true }, + { 264381, true }, + { 264388, true }, + { 264399, true }, + { 264408, true }, + { 264419, true }, + { 264435, true }, + { 264444, true }, + { 264457, false }, + { 264464, true }, + { 264474, true }, + { 264482, true }, { 264493, true }, - { 264502, true }, - { 264516, true }, - { 264536, true }, - { 264546, true }, - { 264558, true }, - { 264567, true }, - { 264576, true }, - { 264596, true }, - { 264607, true }, - { 264618, true }, - { 264632, true }, - { 264641, true }, - { 264657, true }, - { 264664, true }, - { 264676, true }, - { 264686, true }, - { 264693, true }, + { 264505, true }, + { 264515, true }, + { 264530, true }, + { 264539, true }, + { 264553, true }, + { 264573, true }, + { 264583, true }, + { 264595, true }, + { 264604, true }, + { 264613, true }, + { 264633, true }, + { 264644, true }, + { 264655, true }, + { 264669, true }, + { 264678, true }, + { 264694, true }, { 264701, true }, - { 264713, false }, - { 264724, true }, - { 264734, false }, - { 264746, true }, - { 264760, true }, - { 264773, true }, - { 264789, true }, - { 264804, true }, - { 264816, true }, - { 264829, false }, - { 264839, true }, - { 264852, true }, - { 264874, true }, - { 264886, true }, - { 264898, true }, - { 264906, true }, - { 264915, true }, - { 264927, true }, - { 264937, false }, + { 264713, true }, + { 264723, true }, + { 264731, true }, + { 264743, false }, + { 264754, true }, + { 264764, false }, + { 264776, true }, + { 264790, true }, + { 264803, true }, + { 264819, true }, + { 264834, true }, + { 264846, true }, + { 264859, false }, + { 264869, true }, + { 264882, true }, + { 264904, true }, + { 264916, true }, + { 264928, true }, + { 264936, true }, { 264945, true }, - { 264955, true }, - { 264964, true }, - { 264979, true }, - { 264995, false }, - { 265010, false }, - { 265023, true }, - { 265037, true }, - { 265047, false }, - { 265056, true }, - { 265063, true }, - { 265079, true }, - { 265086, true }, - { 265096, true }, - { 265105, true }, - { 265113, true }, - { 265122, true }, - { 265133, true }, - { 265147, true }, - { 265158, true }, - { 265168, true }, - { 265190, true }, - { 265205, true }, - { 265212, true }, - { 265223, true }, - { 265231, true }, - { 265241, true }, + { 264957, true }, + { 264967, true }, + { 264977, true }, + { 264986, true }, + { 265001, true }, + { 265017, false }, + { 265032, false }, + { 265045, true }, + { 265059, true }, + { 265069, false }, + { 265078, true }, + { 265085, true }, + { 265101, true }, + { 265108, true }, + { 265118, true }, + { 265127, true }, + { 265135, true }, + { 265146, true }, + { 265160, true }, + { 265171, true }, + { 265181, true }, + { 265203, true }, + { 265218, true }, + { 265225, true }, + { 265236, true }, + { 265244, true }, { 265254, true }, - { 265272, true }, - { 265284, false }, - { 265293, true }, - { 265307, true }, - { 265323, true }, - { 265340, true }, - { 265364, true }, - { 265382, true }, + { 265267, true }, + { 265285, true }, + { 265297, false }, + { 265306, true }, + { 265320, true }, + { 265336, true }, + { 265353, true }, + { 265377, true }, { 265395, true }, - { 265412, true }, - { 265424, true }, - { 265435, true }, + { 265408, true }, + { 265425, true }, + { 265437, true }, { 265448, true }, - { 265460, false }, - { 265475, true }, - { 265485, true }, - { 265497, true }, - { 265509, false }, - { 265519, true }, - { 265543, true }, - { 265554, true }, - { 265564, true }, + { 265461, true }, + { 265473, false }, + { 265488, true }, + { 265498, true }, + { 265510, true }, + { 265522, true }, + { 265542, false }, + { 265552, true }, { 265576, true }, - { 265589, true }, - { 265606, true }, - { 265621, true }, - { 265634, true }, - { 265648, true }, - { 265664, true }, - { 265679, true }, - { 265694, true }, - { 265706, true }, - { 265718, true }, - { 265732, true }, - { 265743, true }, - { 265753, true }, - { 265771, true }, - { 265784, true }, + { 265587, true }, + { 265597, true }, + { 265609, true }, + { 265622, true }, + { 265639, true }, + { 265654, true }, + { 265667, true }, + { 265681, true }, + { 265697, true }, + { 265712, true }, + { 265727, true }, + { 265739, true }, + { 265751, true }, + { 265765, true }, + { 265776, true }, + { 265786, true }, { 265799, true }, - { 265812, true }, - { 265825, true }, - { 265840, true }, - { 265852, true }, - { 265861, true }, - { 265872, true }, - { 265894, true }, - { 265910, true }, - { 265930, false }, - { 265939, true }, - { 265947, true }, - { 265955, true }, - { 265968, true }, - { 265981, true }, + { 265817, true }, + { 265830, true }, + { 265845, true }, + { 265858, true }, + { 265871, true }, + { 265886, true }, + { 265898, true }, + { 265907, true }, + { 265918, true }, + { 265940, true }, + { 265956, true }, + { 265976, false }, + { 265985, true }, { 265993, true }, { 266001, true }, - { 266016, true }, - { 266026, true }, - { 266037, true }, - { 266053, true }, - { 266061, true }, - { 266070, true }, - { 266080, true }, - { 266089, true }, - { 266098, true }, - { 266113, true }, - { 266132, true }, - { 266145, true }, - { 266163, true }, - { 266176, true }, - { 266185, true }, - { 266196, true }, - { 266210, true }, + { 266014, true }, + { 266027, true }, + { 266039, true }, + { 266047, true }, + { 266062, true }, + { 266072, true }, + { 266083, true }, + { 266099, true }, + { 266107, true }, + { 266116, true }, + { 266126, true }, + { 266135, true }, + { 266144, true }, + { 266159, true }, + { 266178, true }, + { 266191, true }, + { 266209, true }, { 266222, true }, - { 266240, true }, - { 266253, true }, - { 266261, true }, - { 266275, true }, - { 266287, true }, - { 266297, true }, - { 266304, true }, - { 266318, true }, - { 266326, true }, - { 266334, true }, - { 266348, true }, - { 266358, true }, - { 266367, true }, - { 266390, true }, - { 266403, true }, - { 266408, true }, - { 266418, true }, - { 266425, true }, - { 266432, true }, - { 266444, false }, - { 266463, true }, - { 266474, true }, - { 266490, true }, - { 266505, true }, - { 266521, true }, + { 266231, true }, + { 266242, true }, + { 266256, true }, + { 266268, true }, + { 266286, true }, + { 266299, true }, + { 266307, true }, + { 266321, true }, + { 266333, true }, + { 266343, true }, + { 266350, true }, + { 266364, true }, + { 266372, true }, + { 266380, true }, + { 266394, true }, + { 266404, true }, + { 266413, true }, + { 266436, true }, + { 266449, true }, + { 266454, true }, + { 266464, true }, + { 266471, true }, + { 266478, true }, + { 266490, false }, + { 266509, true }, + { 266520, true }, { 266536, true }, - { 266549, true }, - { 266562, true }, - { 266570, true }, - { 266580, true }, - { 266590, true }, - { 266605, true }, - { 266619, true }, - { 266647, true }, - { 266660, true }, - { 266677, true }, - { 266685, true }, - { 266694, true }, - { 266704, true }, - { 266717, true }, - { 266729, true }, - { 266759, true }, - { 266770, true }, - { 266788, true }, - { 266796, true }, - { 266820, true }, - { 266830, true }, - { 266847, true }, - { 266859, true }, - { 266870, true }, - { 266882, true }, - { 266895, false }, - { 266902, true }, - { 266920, true }, - { 266929, true }, - { 266940, true }, - { 266952, true }, - { 266960, true }, - { 266967, true }, + { 266551, true }, + { 266567, true }, + { 266582, true }, + { 266595, true }, + { 266608, true }, + { 266616, true }, + { 266626, true }, + { 266636, true }, + { 266651, true }, + { 266665, true }, + { 266693, true }, + { 266706, true }, + { 266723, true }, + { 266731, true }, + { 266740, true }, + { 266750, true }, + { 266763, true }, + { 266775, true }, + { 266805, true }, + { 266816, true }, + { 266834, true }, + { 266842, true }, + { 266866, true }, + { 266876, true }, + { 266893, true }, + { 266905, true }, + { 266916, true }, + { 266928, true }, + { 266941, false }, + { 266948, true }, + { 266966, true }, { 266975, true }, { 266986, true }, - { 266996, true }, - { 267005, true }, - { 267023, true }, - { 267049, true }, - { 267061, true }, - { 267070, true }, + { 266998, true }, + { 267006, true }, + { 267013, true }, + { 267021, true }, + { 267032, true }, + { 267042, true }, + { 267051, true }, + { 267069, true }, { 267095, true }, - { 267122, true }, - { 267142, true }, - { 267164, true }, - { 267175, true }, - { 267186, true }, - { 267198, true }, - { 267211, true }, - { 267224, true }, - { 267239, true }, + { 267107, true }, + { 267116, true }, + { 267141, true }, + { 267168, true }, + { 267188, true }, + { 267210, true }, + { 267221, true }, + { 267232, true }, + { 267244, true }, { 267257, true }, { 267270, true }, { 267285, true }, - { 267301, true }, - { 267319, true }, - { 267332, true }, - { 267346, true }, - { 267356, true }, - { 267368, true }, - { 267376, true }, - { 267388, true }, - { 267400, true }, - { 267413, true }, - { 267424, true }, - { 267437, true }, - { 267449, true }, - { 267461, false }, - { 267471, true }, - { 267482, true }, - { 267497, true }, - { 267510, true }, - { 267521, true }, + { 267303, true }, + { 267316, true }, + { 267331, true }, + { 267347, true }, + { 267365, true }, + { 267378, true }, + { 267392, true }, + { 267402, true }, + { 267414, true }, + { 267422, true }, + { 267434, true }, + { 267446, true }, + { 267459, true }, + { 267470, true }, + { 267483, true }, + { 267495, true }, + { 267507, false }, + { 267517, true }, { 267528, true }, - { 267538, true }, - { 267545, true }, - { 267559, true }, - { 267577, true }, - { 267589, true }, - { 267601, true }, - { 267617, true }, - { 267630, true }, - { 267645, true }, - { 267660, true }, - { 267673, true }, - { 267685, true }, - { 267699, true }, - { 267712, true }, - { 267727, true }, - { 267734, true }, - { 267749, true }, - { 267762, true }, - { 267774, true }, - { 267783, true }, + { 267543, true }, + { 267556, true }, + { 267567, true }, + { 267574, true }, + { 267584, true }, + { 267591, true }, + { 267605, true }, + { 267623, true }, + { 267635, true }, + { 267647, true }, + { 267663, true }, + { 267676, true }, + { 267691, true }, + { 267706, true }, + { 267719, true }, + { 267731, true }, + { 267745, true }, + { 267758, true }, + { 267773, true }, + { 267780, true }, { 267795, true }, - { 267824, true }, - { 267832, true }, - { 267847, true }, - { 267855, true }, - { 267870, false }, + { 267808, true }, + { 267820, true }, + { 267829, true }, + { 267841, true }, + { 267870, true }, { 267878, true }, - { 267889, true }, - { 267897, true }, - { 267908, true }, - { 267925, true }, - { 267939, false }, - { 267951, true }, - { 267970, true }, - { 267988, true }, - { 267999, true }, - { 268008, true }, - { 268028, true }, - { 268038, true }, + { 267893, true }, + { 267901, true }, + { 267916, false }, + { 267924, true }, + { 267935, true }, + { 267943, true }, + { 267954, true }, + { 267971, true }, + { 267985, false }, + { 267997, true }, + { 268016, true }, + { 268034, true }, + { 268045, true }, { 268054, true }, - { 268069, true }, - { 268081, true }, - { 268088, true }, - { 268099, true }, - { 268109, true }, + { 268074, true }, + { 268084, true }, + { 268100, true }, { 268115, true }, - { 268125, true }, - { 268140, true }, - { 268152, true }, - { 268164, true }, - { 268179, true }, - { 268190, true }, - { 268203, true }, - { 268227, true }, - { 268238, true }, + { 268127, true }, + { 268134, true }, + { 268145, true }, + { 268155, true }, + { 268161, true }, + { 268171, true }, + { 268186, true }, + { 268198, true }, + { 268210, true }, + { 268225, true }, + { 268236, true }, { 268249, true }, - { 268260, true }, - { 268271, true }, - { 268282, true }, - { 268297, true }, - { 268321, true }, - { 268339, true }, - { 268350, true }, - { 268365, true }, - { 268381, true }, - { 268390, true }, - { 268401, true }, - { 268425, true }, - { 268440, true }, - { 268452, true }, - { 268464, true }, - { 268475, true }, - { 268485, true }, - { 268493, true }, - { 268512, true }, - { 268523, true }, - { 268533, true }, - { 268543, true }, - { 268554, true }, - { 268562, true }, - { 268576, false }, - { 268583, true }, - { 268590, true }, - { 268602, true }, - { 268611, true }, - { 268620, true }, - { 268634, true }, - { 268642, true }, - { 268655, true }, - { 268669, true }, - { 268690, true }, - { 268704, true }, - { 268714, true }, - { 268721, true }, - { 268732, true }, - { 268742, true }, - { 268752, true }, - { 268762, true }, - { 268775, true }, - { 268786, true }, - { 268794, true }, - { 268803, true }, - { 268823, true }, - { 268846, true }, - { 268859, true }, - { 268872, false }, - { 268879, true }, + { 268273, true }, + { 268284, true }, + { 268295, true }, + { 268306, true }, + { 268317, true }, + { 268328, true }, + { 268343, true }, + { 268367, true }, + { 268385, true }, + { 268396, true }, + { 268411, true }, + { 268427, true }, + { 268436, true }, + { 268447, true }, + { 268471, true }, + { 268486, true }, + { 268498, true }, + { 268510, true }, + { 268521, true }, + { 268531, true }, + { 268539, true }, + { 268558, true }, + { 268569, true }, + { 268579, true }, + { 268589, true }, + { 268600, true }, + { 268608, true }, + { 268622, false }, + { 268629, true }, + { 268636, true }, + { 268648, true }, + { 268657, true }, + { 268666, true }, + { 268680, true }, + { 268688, true }, + { 268701, true }, + { 268715, true }, + { 268736, true }, + { 268750, true }, + { 268760, true }, + { 268767, true }, + { 268778, true }, + { 268788, true }, + { 268798, true }, + { 268808, true }, + { 268821, true }, + { 268832, true }, + { 268840, true }, + { 268849, true }, + { 268869, true }, { 268892, true }, - { 268902, true }, - { 268913, true }, - { 268923, true }, - { 268933, true }, - { 268942, true }, - { 268949, true }, + { 268905, true }, + { 268918, false }, + { 268925, true }, + { 268938, true }, + { 268948, true }, { 268959, true }, + { 268969, true }, + { 268979, true }, + { 268988, true }, + { 268995, true }, + { 269005, true }, }; From a349619e6b35a0eba9c4dd8c92978169f2a9d049 Mon Sep 17 00:00:00 2001 From: ffxbld <> Date: Wed, 22 Mar 2017 07:50:19 -0700 Subject: [PATCH 259/300] No bug, Automated HPKP preload list update from host bld-linux64-spot-388 - a=hpkp-update --- security/manager/ssl/StaticHPKPins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index 3eb79770588ad..7712b0bdba9c0 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498576420343000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1498661200751000); From c28ecf83236c2a2a01851c5f5b09495c6ed12aab Mon Sep 17 00:00:00 2001 From: ffxbld <> Date: Wed, 22 Mar 2017 07:50:21 -0700 Subject: [PATCH 260/300] No bug, Automated blocklist update from host bld-linux64-spot-388 - a=blocklist-update --- browser/app/blocklist.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/browser/app/blocklist.xml b/browser/app/blocklist.xml index 0701b5fa2ea7a..066376591f1b8 100644 --- a/browser/app/blocklist.xml +++ b/browser/app/blocklist.xml @@ -2180,6 +2180,11 @@ https://get.adobe.com/flashplayer/ + + + https://get.adobe.com/flashplayer/ + + @@ -2206,6 +2211,11 @@ + + + https://get.adobe.com/flashplayer/ + + https://get.adobe.com/flashplayer/ From 6a670943028b7921959945cc0d97cf3373ccd9e5 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Wed, 22 Mar 2017 15:52:20 +0100 Subject: [PATCH 261/300] Bug 1348801 - bump eslint to fix orange a=tomcat r=Standard8 --- browser/.eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/.eslintrc.js b/browser/.eslintrc.js index 0170904faeb66..28030efb6898e 100644 --- a/browser/.eslintrc.js +++ b/browser/.eslintrc.js @@ -8,7 +8,7 @@ module.exports = { "rules": { // XXX Bug 1326071 - This should be reduced down - probably to 20 or to // be removed & synced with the mozilla/recommended value. - "complexity": ["error", {"max": 40}], + "complexity": ["error", {"max": 42}], "no-shadow": "error", } From 986ab3fbfdad190f0a3638523782efe697bc98e7 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Wed, 22 Mar 2017 11:04:30 -0400 Subject: [PATCH 262/300] Backed out changeset 619b5b27ce87 (bug 1343499) for CLOSED TREE build bustage r=backout --- image/DynamicImage.cpp | 6 -- image/DynamicImage.h | 1 - image/FrameTimeout.h | 119 ---------------------- image/ImageMetadata.h | 13 +-- image/ImageOps.cpp | 110 ++------------------ image/ImageOps.h | 61 +---------- image/ImageWrapper.cpp | 6 -- image/ImageWrapper.h | 1 - image/OrientedImage.cpp | 16 --- image/OrientedImage.h | 1 - image/RasterImage.cpp | 19 ---- image/RasterImage.h | 2 - image/VectorImage.cpp | 7 -- image/VectorImage.h | 1 - image/decoders/nsICODecoder.cpp | 2 - image/imgFrame.h | 101 +++++++++++++++++- image/imgIContainer.idl | 4 - image/moz.build | 2 - image/test/gtest/Common.cpp | 6 -- image/test/gtest/Common.h | 2 - image/test/gtest/TestDecodeToSurface.cpp | 84 ++------------- image/test/gtest/TestDecoders.cpp | 84 --------------- image/test/gtest/green-multiple-sizes.ico | Bin 14144 -> 0 bytes image/test/gtest/moz.build | 1 - 24 files changed, 119 insertions(+), 530 deletions(-) delete mode 100644 image/FrameTimeout.h delete mode 100644 image/test/gtest/green-multiple-sizes.ico diff --git a/image/DynamicImage.cpp b/image/DynamicImage.cpp index 47c920944c3ec..d6444066a9e92 100644 --- a/image/DynamicImage.cpp +++ b/image/DynamicImage.cpp @@ -127,12 +127,6 @@ DynamicImage::GetHeight(int32_t* aHeight) return NS_OK; } -nsresult -DynamicImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - NS_IMETHODIMP DynamicImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/DynamicImage.h b/image/DynamicImage.h index 09c6ed550a257..a39a29b8e37ed 100644 --- a/image/DynamicImage.h +++ b/image/DynamicImage.h @@ -31,7 +31,6 @@ class DynamicImage : public Image } // Inherited methods from Image. - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t SizeOfSourceWithComputedFallback( MallocSizeOf aMallocSizeOf) const override; diff --git a/image/FrameTimeout.h b/image/FrameTimeout.h deleted file mode 100644 index 4070bba65b2b5..0000000000000 --- a/image/FrameTimeout.h +++ /dev/null @@ -1,119 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef mozilla_image_FrameTimeout_h -#define mozilla_image_FrameTimeout_h - -#include -#include "mozilla/Assertions.h" - -namespace mozilla { -namespace image { - -/** - * FrameTimeout wraps a frame timeout value (measured in milliseconds) after - * first normalizing it. This normalization is necessary because some tools - * generate incorrect frame timeout values which we nevertheless have to - * support. For this reason, code that deals with frame timeouts should always - * use a FrameTimeout value rather than the raw value from the image header. - */ -struct FrameTimeout -{ - /** - * @return a FrameTimeout of zero. This should be used only for math - * involving FrameTimeout values. You can't obtain a zero FrameTimeout from - * FromRawMilliseconds(). - */ - static FrameTimeout Zero() { return FrameTimeout(0); } - - /// @return an infinite FrameTimeout. - static FrameTimeout Forever() { return FrameTimeout(-1); } - - /// @return a FrameTimeout obtained by normalizing a raw timeout value. - static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) - { - // Normalize all infinite timeouts to the same value. - if (aRawMilliseconds < 0) { - return FrameTimeout::Forever(); - } - - // Very small timeout values are problematic for two reasons: we don't want - // to burn energy redrawing animated images extremely fast, and broken tools - // generate these values when they actually want a "default" value, so such - // images won't play back right without normalization. For some context, - // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical - // behavior of IE and Opera was: - // IE 6/Win: - // 10 - 50ms is normalized to 100ms. - // >50ms is used unnormalized. - // Opera 7 final/Win: - // 10ms is normalized to 100ms. - // >10ms is used unnormalized. - if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { - return FrameTimeout(100); - } - - // The provided timeout value is OK as-is. - return FrameTimeout(aRawMilliseconds); - } - - bool operator==(const FrameTimeout& aOther) const - { - return mTimeout == aOther.mTimeout; - } - - bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } - - FrameTimeout operator+(const FrameTimeout& aOther) - { - if (*this == Forever() || aOther == Forever()) { - return Forever(); - } - - return FrameTimeout(mTimeout + aOther.mTimeout); - } - - FrameTimeout& operator+=(const FrameTimeout& aOther) - { - *this = *this + aOther; - return *this; - } - - /** - * @return this FrameTimeout's value in milliseconds. Illegal to call on a - * an infinite FrameTimeout value. - */ - uint32_t AsMilliseconds() const - { - if (*this == Forever()) { - MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); - return 100; // Fail to something sane. - } - - return uint32_t(mTimeout); - } - - /** - * @return this FrameTimeout value encoded so that non-negative values - * represent a timeout in milliseconds, and -1 represents an infinite - * timeout. - * - * XXX(seth): This is a backwards compatibility hack that should be removed. - */ - int32_t AsEncodedValueDeprecated() const { return mTimeout; } - -private: - explicit FrameTimeout(int32_t aTimeout) - : mTimeout(aTimeout) - { } - - int32_t mTimeout; -}; - -} // namespace image -} // namespace mozilla - -#endif // mozilla_image_FrameTimeout_h diff --git a/image/ImageMetadata.h b/image/ImageMetadata.h index b1a2edfb03fde..05f5729802c71 100644 --- a/image/ImageMetadata.h +++ b/image/ImageMetadata.h @@ -11,11 +11,12 @@ #include "mozilla/Maybe.h" #include "nsSize.h" #include "Orientation.h" -#include "FrameTimeout.h" namespace mozilla { namespace image { +class RasterImage; + // The metadata about an image that decoders accumulate as they decode. class ImageMetadata { @@ -63,13 +64,6 @@ class ImageMetadata nsIntSize GetSize() const { return *mSize; } bool HasSize() const { return mSize.isSome(); } - void AddNativeSize(const nsIntSize& aSize) - { - mNativeSizes.AppendElement(aSize); - } - - const nsTArray& GetNativeSizes() const { return mNativeSizes; } - Orientation GetOrientation() const { return *mOrientation; } bool HasOrientation() const { return mOrientation.isSome(); } @@ -96,9 +90,6 @@ class ImageMetadata Maybe mSize; Maybe mOrientation; - // Sizes the image can natively decode to. - nsTArray mNativeSizes; - bool mHasAnimation : 1; }; diff --git a/image/ImageOps.cpp b/image/ImageOps.cpp index fb4fc8fb70751..d1d5da283642d 100644 --- a/image/ImageOps.cpp +++ b/image/ImageOps.cpp @@ -14,7 +14,6 @@ #include "FrozenImage.h" #include "IDecodingTask.h" #include "Image.h" -#include "ImageMetadata.h" #include "imgIContainer.h" #include "mozilla/gfx/2D.h" #include "nsStreamUtils.h" @@ -80,27 +79,10 @@ ImageOps::CreateFromDrawable(gfxDrawable* aDrawable) return drawableImage.forget(); } -class ImageOps::ImageBufferImpl final : public ImageOps::ImageBuffer { -public: - ImageBufferImpl(already_AddRefed aSourceBuffer) - : mSourceBuffer(aSourceBuffer) - { } - -protected: - ~ImageBufferImpl() override { } - - virtual already_AddRefed GetSourceBuffer() - { - RefPtr sourceBuffer = mSourceBuffer; - return sourceBuffer.forget(); - } - -private: - RefPtr mSourceBuffer; -}; - -/* static */ already_AddRefed -ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) +/* static */ already_AddRefed +ImageOps::DecodeToSurface(nsIInputStream* aInputStream, + const nsACString& aMimeType, + uint32_t aFlags) { MOZ_ASSERT(aInputStream); @@ -125,7 +107,7 @@ ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) } // Write the data into a SourceBuffer. - RefPtr sourceBuffer = new SourceBuffer(); + NotNull> sourceBuffer = WrapNotNull(new SourceBuffer()); sourceBuffer->ExpectLength(length); rv = sourceBuffer->AppendFromInputStream(inputStream, length); if (NS_FAILED(rv)) { @@ -140,90 +122,12 @@ ImageOps::CreateImageBuffer(nsIInputStream* aInputStream) } sourceBuffer->Complete(NS_OK); - RefPtr imageBuffer = new ImageBufferImpl(sourceBuffer.forget()); - return imageBuffer.forget(); -} - -/* static */ nsresult -ImageOps::DecodeMetadata(nsIInputStream* aInputStream, - const nsACString& aMimeType, - ImageMetadata& aMetadata) -{ - RefPtr buffer = CreateImageBuffer(aInputStream); - return DecodeMetadata(buffer, aMimeType, aMetadata); -} - -/* static */ nsresult -ImageOps::DecodeMetadata(ImageBuffer* aBuffer, - const nsACString& aMimeType, - ImageMetadata& aMetadata) -{ - if (!aBuffer) { - return NS_ERROR_FAILURE; - } - - RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); - if (NS_WARN_IF(!sourceBuffer)) { - return NS_ERROR_FAILURE; - } - - // Create a decoder. - DecoderType decoderType = - DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); - RefPtr decoder = - DecoderFactory::CreateAnonymousMetadataDecoder(decoderType, - WrapNotNull(sourceBuffer)); - if (!decoder) { - return NS_ERROR_FAILURE; - } - - // Run the decoder synchronously. - RefPtr task = new AnonymousDecodingTask(WrapNotNull(decoder)); - task->Run(); - if (!decoder->GetDecodeDone() || decoder->HasError()) { - return NS_ERROR_FAILURE; - } - - aMetadata = decoder->GetImageMetadata(); - if (aMetadata.GetNativeSizes().IsEmpty() && aMetadata.HasSize()) { - aMetadata.AddNativeSize(aMetadata.GetSize()); - } - - return NS_OK; -} - -/* static */ already_AddRefed -ImageOps::DecodeToSurface(nsIInputStream* aInputStream, - const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize /* = Nothing() */) -{ - RefPtr buffer = CreateImageBuffer(aInputStream); - return DecodeToSurface(buffer, aMimeType, aFlags, aSize); -} - -/* static */ already_AddRefed -ImageOps::DecodeToSurface(ImageBuffer* aBuffer, - const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize /* = Nothing() */) -{ - if (!aBuffer) { - return nullptr; - } - - RefPtr sourceBuffer = aBuffer->GetSourceBuffer(); - if (NS_WARN_IF(!sourceBuffer)) { - return nullptr; - } - // Create a decoder. DecoderType decoderType = DecoderFactory::GetDecoderType(PromiseFlatCString(aMimeType).get()); RefPtr decoder = - DecoderFactory::CreateAnonymousDecoder(decoderType, - WrapNotNull(sourceBuffer), - aSize, ToSurfaceFlags(aFlags)); + DecoderFactory::CreateAnonymousDecoder(decoderType, sourceBuffer, + Nothing(), ToSurfaceFlags(aFlags)); if (!decoder) { return nullptr; } diff --git a/image/ImageOps.h b/image/ImageOps.h index 5a089fd16b030..7a8e19be34410 100644 --- a/image/ImageOps.h +++ b/image/ImageOps.h @@ -9,7 +9,6 @@ #include "nsCOMPtr.h" #include "nsRect.h" -#include "ImageMetadata.h" class gfxDrawable; class imgIContainer; @@ -25,23 +24,10 @@ namespace image { class Image; struct Orientation; -class SourceBuffer; class ImageOps { public: - class ImageBuffer { - public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageOps::ImageBuffer); - protected: - friend class ImageOps; - - ImageBuffer() { } - virtual ~ImageBuffer() { } - - virtual already_AddRefed GetSourceBuffer() = 0; - }; - /** * Creates a version of an existing image which does not animate and is frozen * at the first frame. @@ -88,39 +74,6 @@ class ImageOps static already_AddRefed CreateFromDrawable(gfxDrawable* aDrawable); - /** - * Create a buffer to be used with DecodeMetadata and DecodeToSurface. Reusing - * an ImageBuffer representing the given input stream is more efficient if one - * has multiple Decode* calls to make on that stream. - * - * @param aInputStream An input stream containing an encoded image. - * @return An image buffer derived from the input stream. - */ - static already_AddRefed - CreateImageBuffer(nsIInputStream* aInputStream); - - /** - * Decodes an image's metadata from an nsIInputStream into the given - * structure. This function may be called off-main-thread. - * - * @param aInputStream An input stream containing an encoded image. - * @param aMimeType The MIME type of the image. - * @param aMetadata Where the image metadata is stored upon success. - * @return The status of the operation. - */ - static nsresult - DecodeMetadata(nsIInputStream* aInputStream, - const nsACString& aMimeType, - ImageMetadata& aMetadata); - - /** - * Same as above but takes an ImageBuffer instead of nsIInputStream. - */ - static nsresult - DecodeMetadata(ImageBuffer* aBuffer, - const nsACString& aMimeType, - ImageMetadata& aMetadata); - /** * Decodes an image from an nsIInputStream directly into a SourceSurface, * without ever creating an Image or imgIContainer (which are mostly @@ -136,21 +89,9 @@ class ImageOps static already_AddRefed DecodeToSurface(nsIInputStream* aInputStream, const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize = Nothing()); - - /** - * Same as above but takes an ImageBuffer instead of nsIInputStream. - */ - static already_AddRefed - DecodeToSurface(ImageBuffer* aBuffer, - const nsACString& aMimeType, - uint32_t aFlags, - Maybe aSize = Nothing()); + uint32_t aFlags); private: - class ImageBufferImpl; - // This is a static utility class, so disallow instantiation. virtual ~ImageOps() = 0; }; diff --git a/image/ImageWrapper.cpp b/image/ImageWrapper.cpp index 8524799045679..dfc76641fd6f4 100644 --- a/image/ImageWrapper.cpp +++ b/image/ImageWrapper.cpp @@ -139,12 +139,6 @@ ImageWrapper::GetHeight(int32_t* aHeight) return mInnerImage->GetHeight(aHeight); } -nsresult -ImageWrapper::GetNativeSizes(nsTArray& aNativeSizes) const -{ - return mInnerImage->GetNativeSizes(aNativeSizes); -} - NS_IMETHODIMP ImageWrapper::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/ImageWrapper.h b/image/ImageWrapper.h index 19e9cb8582329..94cf0948b537c 100644 --- a/image/ImageWrapper.h +++ b/image/ImageWrapper.h @@ -22,7 +22,6 @@ class ImageWrapper : public Image NS_DECL_IMGICONTAINER // Inherited methods from Image. - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual already_AddRefed GetProgressTracker() override; virtual size_t diff --git a/image/OrientedImage.cpp b/image/OrientedImage.cpp index 79767e2a796ab..951b0acbc94d1 100644 --- a/image/OrientedImage.cpp +++ b/image/OrientedImage.cpp @@ -46,22 +46,6 @@ OrientedImage::GetHeight(int32_t* aHeight) } } -nsresult -OrientedImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - nsresult rv = InnerImage()->GetNativeSizes(aNativeSizes); - - if (mOrientation.SwapsWidthAndHeight()) { - auto i = aNativeSizes.Length(); - while (i > 0) { - --i; - swap(aNativeSizes[i].width, aNativeSizes[i].height); - } - } - - return rv; -} - NS_IMETHODIMP OrientedImage::GetIntrinsicSize(nsSize* aSize) { diff --git a/image/OrientedImage.h b/image/OrientedImage.h index d1291ea74b20a..2edf05de9f50c 100644 --- a/image/OrientedImage.h +++ b/image/OrientedImage.h @@ -30,7 +30,6 @@ class OrientedImage : public ImageWrapper NS_IMETHOD GetWidth(int32_t* aWidth) override; NS_IMETHOD GetHeight(int32_t* aHeight) override; - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; NS_IMETHOD GetIntrinsicSize(nsSize* aSize) override; NS_IMETHOD GetIntrinsicRatio(nsSize* aRatio) override; NS_IMETHOD_(already_AddRefed) diff --git a/image/RasterImage.cpp b/image/RasterImage.cpp index b3da4ff3697e6..b987448502951 100644 --- a/image/RasterImage.cpp +++ b/image/RasterImage.cpp @@ -220,24 +220,6 @@ RasterImage::GetHeight(int32_t* aHeight) return NS_OK; } -//****************************************************************************** -nsresult -RasterImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - if (mError) { - return NS_ERROR_FAILURE; - } - - if (mNativeSizes.IsEmpty()) { - aNativeSizes.Clear(); - aNativeSizes.AppendElement(mSize); - } else { - aNativeSizes = mNativeSizes; - } - - return NS_OK; -} - //****************************************************************************** NS_IMETHODIMP RasterImage::GetIntrinsicSize(nsSize* aSize) @@ -721,7 +703,6 @@ RasterImage::SetMetadata(const ImageMetadata& aMetadata, // Set the size and flag that we have it. mSize = size; mOrientation = orientation; - mNativeSizes = aMetadata.GetNativeSizes(); mHasSize = true; } diff --git a/image/RasterImage.h b/image/RasterImage.h index 023985669a7a7..09fa18b4df655 100644 --- a/image/RasterImage.h +++ b/image/RasterImage.h @@ -160,7 +160,6 @@ class RasterImage final : public ImageResource NS_DECL_IMGICONTAINERDEBUG #endif - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual nsresult StartAnimation() override; virtual nsresult StopAnimation() override; @@ -381,7 +380,6 @@ class RasterImage final : public ImageResource private: // data nsIntSize mSize; - nsTArray mNativeSizes; Orientation mOrientation; /// If this has a value, we're waiting for SetSize() to send the load event. diff --git a/image/VectorImage.cpp b/image/VectorImage.cpp index 7c650fc7545ca..fa3ecb8bc049a 100644 --- a/image/VectorImage.cpp +++ b/image/VectorImage.cpp @@ -520,13 +520,6 @@ VectorImage::GetWidth(int32_t* aWidth) return NS_OK; } -//****************************************************************************** -nsresult -VectorImage::GetNativeSizes(nsTArray& aNativeSizes) const -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - //****************************************************************************** NS_IMETHODIMP_(void) VectorImage::RequestRefresh(const TimeStamp& aTime) diff --git a/image/VectorImage.h b/image/VectorImage.h index a05c92f3cf380..cb55e057753cd 100644 --- a/image/VectorImage.h +++ b/image/VectorImage.h @@ -34,7 +34,6 @@ class VectorImage final : public ImageResource, // (no public constructor - use ImageFactory) // Methods inherited from Image - nsresult GetNativeSizes(nsTArray& aNativeSizes) const override; virtual size_t SizeOfSourceWithComputedFallback(MallocSizeOf aMallocSizeOf) const override; virtual void CollectSizeOfSurfaces(nsTArray& aCounters, diff --git a/image/decoders/nsICODecoder.cpp b/image/decoders/nsICODecoder.cpp index d8171431ea837..85b3c139b0d78 100644 --- a/image/decoders/nsICODecoder.cpp +++ b/image/decoders/nsICODecoder.cpp @@ -242,8 +242,6 @@ nsICODecoder::ReadDirEntry(const char* aData) } } - mImageMetadata.AddNativeSize(entrySize); - if (desiredSize) { // Calculate the delta between this resource's size and the desired size, so // we can see if it is better than our current-best option. In the case of diff --git a/image/imgFrame.h b/image/imgFrame.h index bd858e088dcff..77ff3507b1771 100644 --- a/image/imgFrame.h +++ b/image/imgFrame.h @@ -11,7 +11,6 @@ #include "mozilla/MemoryReporting.h" #include "mozilla/Monitor.h" #include "mozilla/Move.h" -#include "FrameTimeout.h" #include "gfxDrawable.h" #include "imgIContainer.h" #include "MainThreadUtils.h" @@ -47,6 +46,106 @@ enum class Opacity : uint8_t { SOME_TRANSPARENCY }; +/** + * FrameTimeout wraps a frame timeout value (measured in milliseconds) after + * first normalizing it. This normalization is necessary because some tools + * generate incorrect frame timeout values which we nevertheless have to + * support. For this reason, code that deals with frame timeouts should always + * use a FrameTimeout value rather than the raw value from the image header. + */ +struct FrameTimeout +{ + /** + * @return a FrameTimeout of zero. This should be used only for math + * involving FrameTimeout values. You can't obtain a zero FrameTimeout from + * FromRawMilliseconds(). + */ + static FrameTimeout Zero() { return FrameTimeout(0); } + + /// @return an infinite FrameTimeout. + static FrameTimeout Forever() { return FrameTimeout(-1); } + + /// @return a FrameTimeout obtained by normalizing a raw timeout value. + static FrameTimeout FromRawMilliseconds(int32_t aRawMilliseconds) + { + // Normalize all infinite timeouts to the same value. + if (aRawMilliseconds < 0) { + return FrameTimeout::Forever(); + } + + // Very small timeout values are problematic for two reasons: we don't want + // to burn energy redrawing animated images extremely fast, and broken tools + // generate these values when they actually want a "default" value, so such + // images won't play back right without normalization. For some context, + // see bug 890743, bug 125137, bug 139677, and bug 207059. The historical + // behavior of IE and Opera was: + // IE 6/Win: + // 10 - 50ms is normalized to 100ms. + // >50ms is used unnormalized. + // Opera 7 final/Win: + // 10ms is normalized to 100ms. + // >10ms is used unnormalized. + if (aRawMilliseconds >= 0 && aRawMilliseconds <= 10 ) { + return FrameTimeout(100); + } + + // The provided timeout value is OK as-is. + return FrameTimeout(aRawMilliseconds); + } + + bool operator==(const FrameTimeout& aOther) const + { + return mTimeout == aOther.mTimeout; + } + + bool operator!=(const FrameTimeout& aOther) const { return !(*this == aOther); } + + FrameTimeout operator+(const FrameTimeout& aOther) + { + if (*this == Forever() || aOther == Forever()) { + return Forever(); + } + + return FrameTimeout(mTimeout + aOther.mTimeout); + } + + FrameTimeout& operator+=(const FrameTimeout& aOther) + { + *this = *this + aOther; + return *this; + } + + /** + * @return this FrameTimeout's value in milliseconds. Illegal to call on a + * an infinite FrameTimeout value. + */ + uint32_t AsMilliseconds() const + { + if (*this == Forever()) { + MOZ_ASSERT_UNREACHABLE("Calling AsMilliseconds() on an infinite FrameTimeout"); + return 100; // Fail to something sane. + } + + return uint32_t(mTimeout); + } + + /** + * @return this FrameTimeout value encoded so that non-negative values + * represent a timeout in milliseconds, and -1 represents an infinite + * timeout. + * + * XXX(seth): This is a backwards compatibility hack that should be removed. + */ + int32_t AsEncodedValueDeprecated() const { return mTimeout; } + +private: + explicit FrameTimeout(int32_t aTimeout) + : mTimeout(aTimeout) + { } + + int32_t mTimeout; +}; + /** * AnimationData contains all of the information necessary for using an imgFrame * as part of an animation. diff --git a/image/imgIContainer.idl b/image/imgIContainer.idl index eed28e2668d96..640eae3525587 100644 --- a/image/imgIContainer.idl +++ b/image/imgIContainer.idl @@ -90,10 +90,6 @@ interface imgIContainer : nsISupports */ readonly attribute int32_t height; - %{C++ - virtual nsresult GetNativeSizes(nsTArray& aNativeSizes) const = 0; - %} - /** * The intrinsic size of this image in appunits. If the image has no intrinsic * size in a dimension, -1 will be returned for that dimension. In the case of diff --git a/image/moz.build b/image/moz.build index 8ccb30247e91d..c3a3a610fd8e9 100644 --- a/image/moz.build +++ b/image/moz.build @@ -37,10 +37,8 @@ XPIDL_MODULE = 'imglib2' EXPORTS += [ 'DrawResult.h', - 'FrameTimeout.h', 'ImageCacheKey.h', 'ImageLogging.h', - 'ImageMetadata.h', 'ImageOps.h', 'ImageRegion.h', 'imgLoader.h', diff --git a/image/test/gtest/Common.cpp b/image/test/gtest/Common.cpp index 4bc7fce1c32e3..4be34461c71ca 100644 --- a/image/test/gtest/Common.cpp +++ b/image/test/gtest/Common.cpp @@ -679,11 +679,5 @@ ImageTestCase TruncatedSmallGIFTestCase() return ImageTestCase("green-1x1-truncated.gif", "image/gif", IntSize(1, 1)); } -ImageTestCase GreenMultipleSizesICOTestCase() -{ - return ImageTestCase("green-multiple-sizes.ico", "image/x-icon", - IntSize(256, 256)); -} - } // namespace image } // namespace mozilla diff --git a/image/test/gtest/Common.h b/image/test/gtest/Common.h index 63b8b9b700262..33fc26e750f82 100644 --- a/image/test/gtest/Common.h +++ b/image/test/gtest/Common.h @@ -414,8 +414,6 @@ ImageTestCase DownscaledTransparentICOWithANDMaskTestCase(); ImageTestCase TruncatedSmallGIFTestCase(); -ImageTestCase GreenMultipleSizesICOTestCase(); - } // namespace image } // namespace mozilla diff --git a/image/test/gtest/TestDecodeToSurface.cpp b/image/test/gtest/TestDecodeToSurface.cpp index f5762d84c1723..dd22d4308d9b1 100644 --- a/image/test/gtest/TestDecodeToSurface.cpp +++ b/image/test/gtest/TestDecodeToSurface.cpp @@ -27,11 +27,9 @@ class DecodeToSurfaceRunnable : public Runnable public: DecodeToSurfaceRunnable(RefPtr& aSurface, nsIInputStream* aInputStream, - ImageOps::ImageBuffer* aImageBuffer, const ImageTestCase& aTestCase) : mSurface(aSurface) , mInputStream(aInputStream) - , mImageBuffer(aImageBuffer) , mTestCase(aTestCase) { } @@ -43,35 +41,16 @@ class DecodeToSurfaceRunnable : public Runnable void Go() { - Maybe outputSize; - if (mTestCase.mOutputSize != mTestCase.mSize) { - outputSize.emplace(mTestCase.mOutputSize); - } - - if (mImageBuffer) { - mSurface = - ImageOps::DecodeToSurface(mImageBuffer, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT, - outputSize); - } else { - mSurface = - ImageOps::DecodeToSurface(mInputStream, - nsDependentCString(mTestCase.mMimeType), - imgIContainer::DECODE_FLAGS_DEFAULT, - outputSize); - } + mSurface = + ImageOps::DecodeToSurface(mInputStream, + nsDependentCString(mTestCase.mMimeType), + imgIContainer::DECODE_FLAGS_DEFAULT); ASSERT_TRUE(mSurface != nullptr); EXPECT_TRUE(mSurface->IsDataSourceSurface()); EXPECT_TRUE(mSurface->GetFormat() == SurfaceFormat::B8G8R8X8 || mSurface->GetFormat() == SurfaceFormat::B8G8R8A8); - - if (outputSize) { - EXPECT_EQ(*outputSize, mSurface->GetSize()); - } else { - EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); - } + EXPECT_EQ(mTestCase.mSize, mSurface->GetSize()); EXPECT_TRUE(IsSolidColor(mSurface, BGRAColor::Green(), mTestCase.mFlags & TEST_CASE_IS_FUZZY ? 1 : 0)); @@ -80,19 +59,14 @@ class DecodeToSurfaceRunnable : public Runnable private: RefPtr& mSurface; nsCOMPtr mInputStream; - RefPtr mImageBuffer; ImageTestCase mTestCase; }; static void -RunDecodeToSurface(const ImageTestCase& aTestCase, - ImageOps::ImageBuffer* aImageBuffer = nullptr) +RunDecodeToSurface(const ImageTestCase& aTestCase) { - nsCOMPtr inputStream; - if (!aImageBuffer) { - inputStream = LoadFile(aTestCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - } + nsCOMPtr inputStream = LoadFile(aTestCase.mPath); + ASSERT_TRUE(inputStream != nullptr); nsCOMPtr thread; nsresult rv = @@ -103,7 +77,7 @@ RunDecodeToSurface(const ImageTestCase& aTestCase, // DecodeToSurface doesn't require any main-thread-only code. RefPtr surface; nsCOMPtr runnable = - new DecodeToSurfaceRunnable(surface, inputStream, aImageBuffer, aTestCase); + new DecodeToSurfaceRunnable(surface, inputStream, aTestCase); thread->Dispatch(runnable, nsIThread::DISPATCH_SYNC); thread->Shutdown(); @@ -148,43 +122,3 @@ TEST_F(ImageDecodeToSurface, Corrupt) imgIContainer::DECODE_FLAGS_DEFAULT); EXPECT_TRUE(surface == nullptr); } - -TEST_F(ImageDecodeToSurface, ICOMultipleSizes) -{ - ImageTestCase testCase = GreenMultipleSizesICOTestCase(); - - nsCOMPtr inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream != nullptr); - - RefPtr buffer = - ImageOps::CreateImageBuffer(inputStream); - ASSERT_TRUE(buffer != nullptr); - - ImageMetadata metadata; - nsresult rv = ImageOps::DecodeMetadata(buffer, - nsDependentCString(testCase.mMimeType), - metadata); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_TRUE(metadata.HasSize()); - EXPECT_EQ(testCase.mSize, metadata.GetSize()); - - const nsTArray& nativeSizes = metadata.GetNativeSizes(); - ASSERT_EQ(6u, nativeSizes.Length()); - - IntSize expectedSizes[] = { - IntSize(16, 16), - IntSize(32, 32), - IntSize(64, 64), - IntSize(128, 128), - IntSize(256, 256), - IntSize(256, 128), - }; - - for (int i = 0; i < 6; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - - // Request decoding at native size - testCase.mOutputSize = nativeSizes[i]; - RunDecodeToSurface(testCase, buffer); - } -} diff --git a/image/test/gtest/TestDecoders.cpp b/image/test/gtest/TestDecoders.cpp index 16b17ac63b3f8..d39b8e404a60f 100644 --- a/image/test/gtest/TestDecoders.cpp +++ b/image/test/gtest/TestDecoders.cpp @@ -672,87 +672,3 @@ TEST_F(ImageDecoders, TruncatedSmallGIFSingleChunk) { CheckDecoderSingleChunk(TruncatedSmallGIFTestCase()); } - -TEST_F(ImageDecoders, MultipleSizesICOSingleChunk) -{ - ImageTestCase testCase = GreenMultipleSizesICOTestCase(); - - // Create an image. - RefPtr image = - ImageFactory::CreateAnonymousImage(nsDependentCString(testCase.mMimeType)); - ASSERT_TRUE(!image->HasError()); - - nsCOMPtr inputStream = LoadFile(testCase.mPath); - ASSERT_TRUE(inputStream); - - // Figure out how much data we have. - uint64_t length; - nsresult rv = inputStream->Available(&length); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Write the data into the image. - rv = image->OnImageDataAvailable(nullptr, nullptr, inputStream, 0, - static_cast(length)); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - // Let the image know we've sent all the data. - rv = image->OnImageDataComplete(nullptr, nullptr, NS_OK, true); - ASSERT_TRUE(NS_SUCCEEDED(rv)); - - RefPtr tracker = image->GetProgressTracker(); - tracker->SyncNotifyProgress(FLAG_LOAD_COMPLETE); - - // Use GetFrame() to force a sync decode of the image. - RefPtr surface = - image->GetFrame(imgIContainer::FRAME_CURRENT, - imgIContainer::FLAG_SYNC_DECODE); - - // Ensure that the image's metadata meets our expectations. - IntSize imageSize(0, 0); - rv = image->GetWidth(&imageSize.width); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - rv = image->GetHeight(&imageSize.height); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - - EXPECT_EQ(testCase.mSize.width, imageSize.width); - EXPECT_EQ(testCase.mSize.height, imageSize.height); - - nsTArray nativeSizes; - rv = image->GetNativeSizes(nativeSizes); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_EQ(6u, nativeSizes.Length()); - - IntSize expectedSizes[] = { - IntSize(16, 16), - IntSize(32, 32), - IntSize(64, 64), - IntSize(128, 128), - IntSize(256, 256), - IntSize(256, 128) - }; - - for (int i = 0; i < 6; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - } - - RefPtr image90 = - ImageOps::Orient(image, Orientation(Angle::D90, Flip::Unflipped)); - rv = image90->GetNativeSizes(nativeSizes); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_EQ(6u, nativeSizes.Length()); - - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - } - EXPECT_EQ(IntSize(128, 256), nativeSizes[5]); - - RefPtr image180 = - ImageOps::Orient(image, Orientation(Angle::D180, Flip::Unflipped)); - rv = image180->GetNativeSizes(nativeSizes); - EXPECT_TRUE(NS_SUCCEEDED(rv)); - ASSERT_EQ(6u, nativeSizes.Length()); - - for (int i = 0; i < 6; ++i) { - EXPECT_EQ(expectedSizes[i], nativeSizes[i]); - } -} diff --git a/image/test/gtest/green-multiple-sizes.ico b/image/test/gtest/green-multiple-sizes.ico deleted file mode 100644 index b9463d0c897117204b2edacfa6cbfc4f5f61d771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14144 zcmeI$u}Z^09LMorsuU?iGF5aj4uYeb;1s1*3sS3eaC9mnh?}dy&3ACb06tZ(!iOf<#;`kn$9d6k7uQwnw00` zaUxyT{R2m&RA=t*nr^D^Qz==H);#5cg;n_hP}ZY(wYf8)+x>!>Ikgv!B;X9iE3tM2N({eIg8WY>=`o{tYb zv)pNI^-teFUZdEfx8di(`TWMvmqon9E8ga6@%BCpJMC`kVf*AdR5C+V;zwm7l&;4? wWulUxM*sl?5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0;O_{00SHw$wg3PC diff --git a/image/test/gtest/moz.build b/image/test/gtest/moz.build index 3e37573dba045..ad69e098518cd 100644 --- a/image/test/gtest/moz.build +++ b/image/test/gtest/moz.build @@ -47,7 +47,6 @@ TEST_HARNESS_FILES.gtest += [ 'first-frame-green.png', 'first-frame-padding.gif', 'green-1x1-truncated.gif', - 'green-multiple-sizes.ico', 'green.bmp', 'green.gif', 'green.ico', From 0d9346c714e543964a9e728b1c35d9645d671780 Mon Sep 17 00:00:00 2001 From: Dylan Roeh Date: Tue, 21 Mar 2017 08:49:15 -0500 Subject: [PATCH 263/300] Bug 1349200 - Ensure mozglue is loaded before checking NEON compatibility in GeckoApp.onCreate(). r=jchen --- mobile/android/base/java/org/mozilla/gecko/GeckoApp.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java index 7bf6aac376c91..42db038390f4f 100644 --- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java @@ -1157,6 +1157,10 @@ public void onCreate(Bundle savedInstanceState) { enableStrictMode(); } + // Mozglue should already be loaded by BrowserApp.onCreate() in Fennec, but in + // custom tabs it may not be. + GeckoLoader.loadMozGlue(getApplicationContext()); + if (!HardwareUtils.isSupportedSystem() || !GeckoLoader.neonCompatible()) { // This build does not support the Android version of the device: Show an error and finish the app. mIsAbortingAppLaunch = true; From 0c10940cbd781e46a805c86683b34236ae60b73d Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Tue, 21 Mar 2017 18:09:27 +0100 Subject: [PATCH 264/300] Bug 1349873 - Removed an outdated link to the highlighter doc; r=pbro MozReview-Commit-ID: JJv9DCiHqpX --- devtools/docs/tools/inspector-panel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/docs/tools/inspector-panel.md b/devtools/docs/tools/inspector-panel.md index 435b0365163de..aa2b9c8394a7f 100644 --- a/devtools/docs/tools/inspector-panel.md +++ b/devtools/docs/tools/inspector-panel.md @@ -85,7 +85,7 @@ __NodeActor__ ## Highlighters One of the important aspects of the inspector is the highlighters. -Some documentation already at: https://wiki.mozilla.org/DevTools/Highlighter +You can find a lot more [documentation about highlighters here](highlighters.md). We don't just have 1 highlighter, we have a framework for highlighters: - a (chrome-only) platform API to inject markup in a native-anonymous node in content (that works on all targets) From f07dd9a93b8defd2feb368fdae69188dc9c8afe2 Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Tue, 21 Mar 2017 18:12:47 +0100 Subject: [PATCH 265/300] Bug 1349873 - Fix old MXR links in highlighters docs; r=pbro MozReview-Commit-ID: E596NIol9Pn --- devtools/docs/tools/highlighters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devtools/docs/tools/highlighters.md b/devtools/docs/tools/highlighters.md index 758a66d1f093a..73768b6bc4e40 100644 --- a/devtools/docs/tools/highlighters.md +++ b/devtools/docs/tools/highlighters.md @@ -110,7 +110,7 @@ In this example, the test DIV will be inserted in the page, and will be displaye ### The AnonymousContent API -In the previous example, the returned `insertedEl` object isn't a DOM node, and it certainly is not `el`. It is a new object, whose type is `AnonymousContent` ([see the WebIDL here](http://mxr.mozilla.org/mozilla-central/source/dom/webidl/AnonymousContent.webidl?force=1)). +In the previous example, the returned `insertedEl` object isn't a DOM node, and it certainly is not `el`. It is a new object, whose type is `AnonymousContent` ([see the WebIDL here](https://dxr.mozilla.org/mozilla-central/source/dom/webidl/AnonymousContent.webidl)). Because of the way content is inserted into the page, it isn't wanted to give consumers a direct reference to the inserted DOM node. This is why `document.insertAnonymousContent(el)` actually **clones** `el` and returns a new object whose API lets consumers make changes to the inserted element in a way that never gives back a reference to the inserted DOM node. @@ -142,7 +142,7 @@ The returned object provides the following API: ### Creating a new highlighter class -A good way to get started is by taking a look at [existing highlighters here](http://mxr.mozilla.org/mozilla-central/source/toolkit/devtools/server/actors/highlighter.js). +A good way to get started is by taking a look at [existing highlighters here](https://dxr.mozilla.org/mozilla-central/source/devtools/server/actors/highlighters.js#697-727). Here is some boilerplate code for a new highlighter class: From e80f8387361fcb49d8adb3833a38a598a5069d9b Mon Sep 17 00:00:00 2001 From: Lars T Hansen Date: Tue, 21 Mar 2017 19:21:34 +0100 Subject: [PATCH 266/300] Bug 1329676 - Wasm: eliminate redundant bounds checks on constant heap addresses. r=luke --- js/src/jit/Ion.cpp | 18 +++++++++++------- js/src/jit/Lowering.cpp | 5 +---- js/src/jit/MIR.h | 11 +++++------ js/src/jit/WasmBCE.cpp | 36 ++++++++++++++++++++++++++++-------- 4 files changed, 45 insertions(+), 25 deletions(-) diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp index d7a51b51083b4..df992177e6a31 100644 --- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -1861,6 +1861,17 @@ OptimizeMIR(MIRGenerator* mir) return false; } + // BCE marks bounds checks as dead, so do BCE before DCE. + if (mir->compilingWasm() && !JitOptions.wasmAlwaysCheckBounds) { + if (!EliminateBoundsChecks(mir, graph)) + return false; + gs.spewPass("Redundant Bounds Check Elimination"); + AssertGraphCoherency(graph); + + if (mir->shouldCancel("BCE")) + return false; + } + { AutoTraceLog log(logger, TraceLogger_EliminateDeadCode); if (!EliminateDeadCode(mir, graph)) @@ -1933,13 +1944,6 @@ OptimizeMIR(MIRGenerator* mir) AssertGraphCoherency(graph); } - if (mir->compilingWasm()) { - if (!EliminateBoundsChecks(mir, graph)) - return false; - gs.spewPass("Redundant Bounds Check Elimination"); - AssertGraphCoherency(graph); - } - AssertGraphCoherency(graph, /* force = */ true); DumpMIRExpressions(graph); diff --git a/js/src/jit/Lowering.cpp b/js/src/jit/Lowering.cpp index 573c2ee3c52a4..7c090b6f9cd59 100644 --- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -4278,10 +4278,7 @@ LIRGenerator::visitWasmBoundsCheck(MWasmBoundsCheck* ins) #ifdef WASM_HUGE_MEMORY MOZ_CRASH("No bounds checking on huge memory"); #else - if (ins->isRedundant()) { - if (MOZ_LIKELY(!JitOptions.wasmAlwaysCheckBounds)) - return; - } + MOZ_ASSERT(!ins->isRedundant()); MDefinition* index = ins->index(); MOZ_ASSERT(index->type() == MIRType::Int32); diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index 63ad3938b6c12..1b67d16d56df5 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -13718,15 +13718,14 @@ class MWasmBoundsCheck : public MBinaryInstruction, public NoTypePolicy::Data { - bool redundant_; wasm::TrapOffset trapOffset_; explicit MWasmBoundsCheck(MDefinition* index, MDefinition* boundsCheckLimit, wasm::TrapOffset trapOffset) : MBinaryInstruction(index, boundsCheckLimit), - redundant_(false), trapOffset_(trapOffset) { - setGuard(); // Effectful: throws for OOB. + // Bounds check is effectful: it throws for OOB. + setGuard(); } public: @@ -13739,11 +13738,11 @@ class MWasmBoundsCheck } bool isRedundant() const { - return redundant_; + return !isGuard(); } - void setRedundant(bool val) { - redundant_ = val; + void setRedundant() { + setNotGuard(); } wasm::TrapOffset trapOffset() const { diff --git a/js/src/jit/WasmBCE.cpp b/js/src/jit/WasmBCE.cpp index aac3627385726..20739a5de0593 100644 --- a/js/src/jit/WasmBCE.cpp +++ b/js/src/jit/WasmBCE.cpp @@ -6,6 +6,7 @@ #include "jit/WasmBCE.h" #include "jit/MIRGenerator.h" #include "jit/MIRGraph.h" +#include "wasm/WasmTypes.h" using namespace js; using namespace js::jit; @@ -42,15 +43,34 @@ jit::EliminateBoundsChecks(MIRGenerator* mir, MIRGraph& graph) switch (def->op()) { case MDefinition::Op_WasmBoundsCheck: { MWasmBoundsCheck* bc = def->toWasmBoundsCheck(); - MDefinition* addr = def->getOperand(0); + MDefinition* addr = bc->index(); - LastSeenMap::AddPtr ptr = lastSeen.lookupForAdd(addr->id()); - if (ptr) { - if (ptr->value()->block()->dominates(block)) - bc->setRedundant(true); - } else { - if (!lastSeen.add(ptr, addr->id(), def)) - return false; + // Eliminate constant-address bounds checks to addresses below + // the heap minimum. + // + // The payload of the MConstant will be Double if the constant + // result is above 2^31-1, but we don't care about that for BCE. + +#ifndef WASM_HUGE_MEMORY + MOZ_ASSERT(wasm::MaxMemoryAccessSize < wasm::GuardSize, + "Guard page handles partial out-of-bounds"); +#endif + + if (addr->isConstant() && addr->toConstant()->type() == MIRType::Int32 && + uint32_t(addr->toConstant()->toInt32()) < mir->minWasmHeapLength()) + { + bc->setRedundant(); + } + else + { + LastSeenMap::AddPtr ptr = lastSeen.lookupForAdd(addr->id()); + if (ptr) { + if (ptr->value()->block()->dominates(block)) + bc->setRedundant(); + } else { + if (!lastSeen.add(ptr, addr->id(), def)) + return false; + } } break; } From 610f03783bbfddfd574bd0efd3ee8fad2eb0dab0 Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Wed, 22 Mar 2017 09:44:53 +0100 Subject: [PATCH 267/300] Bug 1349873 - Moved actor best practices wiki page to /devtools/docs; r=pbro MozReview-Commit-ID: AqPpsVtOxY9 --- devtools/docs/SUMMARY.md | 1 + devtools/docs/backend/actor-best-practices.md | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 devtools/docs/backend/actor-best-practices.md diff --git a/devtools/docs/SUMMARY.md b/devtools/docs/SUMMARY.md index e178d96acf293..0d40d271f526b 100644 --- a/devtools/docs/SUMMARY.md +++ b/devtools/docs/SUMMARY.md @@ -26,3 +26,4 @@ * [Handling Multi-Processes in Actors](backend/actor-e10s-handling.md) * [Writing Actors With protocol.js](backend/protocol.js.md) * [Registering A New Actor](backend/actor-registration.md) + * [Actor Best Practices](backend/actor-best-practices.md) diff --git a/devtools/docs/backend/actor-best-practices.md b/devtools/docs/backend/actor-best-practices.md new file mode 100644 index 0000000000000..b552aae1d2965 --- /dev/null +++ b/devtools/docs/backend/actor-best-practices.md @@ -0,0 +1,38 @@ +# Actor Best Practices + +Some aspects of front and actor design can be tricky to understand, even for experienced engineers. +The following are several best practices you should keep in mind when adding new actors and fronts. + +## Actor Should Clean Up Itself, Don't Wait For the Client + +In the past, some actors would wait for the client to send a "you are done now" message when the toolbox closes to shutdown the actor. +This seems reasonable at first, but keep in mind that the connection can disappear at any moment. +It may not be possible for the client to send this message. + +A better choice is for the actor to do all clean up itself when it's notified that the connection goes away. +Then there's no need for the client to send any clean up message, and we know the actor will be in a good state no matter what. + +## Actor Destruction + +Ensure that the actor's destroy is really destroying everything that it should. Here's an example from the animation actor: + +```js +destroy: function() { + Actor.prototype.destroy.call(this); + events.off(this.tabActor, "will-navigate", this.onWillNavigate); + events.off(this.tabActor, "navigate", this.onNavigate); + + this.stopAnimationPlayerUpdates(); + this.tabActor = this.observer = this.actors = null; +}, +``` + +## Child Actors + +With protocol.js actors, if your creates child actors for further functionality, in most cases you should call: + +```js +this.manage(child); +``` + +in the parent after constructing the child, so that the child is destroyed when the parent is. From 86fb6a90adfff4150da613c5f323bce1531ab973 Mon Sep 17 00:00:00 2001 From: Patrick Brosset Date: Thu, 23 Mar 2017 10:10:03 +0100 Subject: [PATCH 268/300] Bug 1349873 - Move the devtools resource types wiki article to devtools/docs; r=pbro MozReview-Commit-ID: 1On480aiJPk --- devtools/docs/SUMMARY.md | 2 + devtools/docs/misc/adding-files.md | 163 +++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 devtools/docs/misc/adding-files.md diff --git a/devtools/docs/SUMMARY.md b/devtools/docs/SUMMARY.md index 0d40d271f526b..6f3ee91efd747 100644 --- a/devtools/docs/SUMMARY.md +++ b/devtools/docs/SUMMARY.md @@ -27,3 +27,5 @@ * [Writing Actors With protocol.js](backend/protocol.js.md) * [Registering A New Actor](backend/actor-registration.md) * [Actor Best Practices](backend/actor-best-practices.md) +* Miscellaneous + * [Adding New Files](misc/adding-files.md) diff --git a/devtools/docs/misc/adding-files.md b/devtools/docs/misc/adding-files.md new file mode 100644 index 0000000000000..7e0c493493b5c --- /dev/null +++ b/devtools/docs/misc/adding-files.md @@ -0,0 +1,163 @@ +# Adding New Files - Various DevTools Resource Types + +This page lists the various DevTools resource types and how they can be created and loaded. + +## JavaScript Modules + +### Build Configuration + +JavaScript modules are installed by our build system using `moz.build` files. If you add a new JavaScript module, you'll need to update (or add) one of these files to make the build system aware of your new module. See the example below. + +A `moz.build` file must live in the same directory as the files to be installed. Don't list files from a subdirectory in a `moz.build` from a parent directory. + +Following these steps ensures that `require()` and `resource://` paths map directly to locations in the source tree, instead of being totally arbitrary. + +Example: + +* File: `/devtools/server/actors/layout.js` +* In `/devtools/server/actors/moz.build`: + +``` +DevToolsModules( + 'layout.js' +) +``` + +### `require()` + +Most DevTools JS code is in the form of CommonJS modules that loaded with `require()`. + +To `require()` a file, the module ID is exactly its source tree path. + +Example: + +* File: `/devtools/server/actors/layout.js` +* Usage (prefer lazy in most cases): + * `loader.lazyRequireGetter(this, "layout", "devtools/server/actors/layout")` + * `require("devtools/server/actors/layout")` + +### `Cu.import()` + +Some older DevTools JS modules use the Gecko [JavaScript code module](https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Using) format with the file extension `.jsm`. We are trying to move away from this format, so it's unlikely you would add a new one, but you might need to import an existing one in your code. + +These modules are loaded using `Cu.import()`. To `import()` a file, you provide a `resource://` URL, which is exactly the source tree path. + +In more detail: + +* `/devtools/client/: resource://devtools/client/` +* `/devtools/server/: resource://devtools/server/` +* `/devtools/shared/: resource://devtools/shared/` + +Example: + +* File: `/devtools/shared/Loader.jsm` +* Usage: + * `Cu.import("resource://devtools/shared/Loader.jsm")` + +Example: + +* File: `/devtools/client/framework/gDevTools.jsm` +* Usage (prefer lazy in most cases): + * `loader.lazyImporter(this, "gDevTools", "resource://devtools/client/framework/gDevTools.jsm")` + * `Cu.import("resource://devtools/client/framework/gDevTools.jsm")` + +## Chrome Content + +Much of the DevTools front-end / UI is currently loaded using `chrome://` URLs, which allow those files to have privileged access to platform internals. + +This is typically used to load XUL, HTML, and JS files in the UI. + +Note: "Chrome" here means "browser chrome", as in the UI, and bears no relation to "Chrome" as in the browser. We'd like to move away from this on DevTools and be more like regular web sites, but most tools are using `chrome://` URLs for now. + +### Packaging + +If you add a new file that should be loaded via a `chrome://` URL, you need to update a manifest file at `/devtools/client/jar.mn` so that it's packaged correctly. + +Please ensure that any new files are added so their entire source tree path is part of the URL. To do so, the `jar.mn` entry should look like: + +``` +content/ () +``` + +where `` is the path to your file after removing the `/devtools/client/` prefix. + +Example: + +* File: `/devtools/client/webaudioeditor/models.js` +* Entry: `content/webaudioeditor/models.js (webaudioeditor/models.js)` + +### Usage + +Chrome content URLs almost match their source tree path, with one difference: the segment `client` is replaced by `content`. This is a requirement of the `chrome://` protocol handler. + +Example: + +* File: `/devtools/client/webaudioeditor/models.js` +Usage: `chrome://devtools/content/webaudioeditor/models.js` + +For files within a single tool, consider relative URLs. They're shorter! + +## Chrome Themes + +Similar to the chrome content section above, we also use chrome themes (or `skin` URLs) in the DevTools UI. These are typically used to load CSS and images. + +### Packaging + +If you add a new file that should be loaded via `chrome://` (such as a new CSS file for a tool UI), you need to update a manifest file at `/devtools/client/jar.mn` so that it's packaged correctly. + +Please ensure that any new files are added so their entire source tree path is part of the URL. To do so, the `jar.mn` entry should look like: + +``` +skin/ (themes/) +``` + +where `` is the path to your file after removing the `/devtools/client/themes/` prefix. + +Example: + +* File: `/devtools/client/themes/images/add.svg` +* Entry: `skin/images/add.svg (themes/images/add.svg)` + +### Usage + +Chrome theme URLs almost match their source tree path, with one difference: the segment `client/themes` is replaced by `skin`. This is a requirement of the `chrome://` protocol handler. + +Example: + +* File: `/devtools/client/themes/images/add.svg` +* Usage: `chrome://devtools/skin/images/add.svg` + +## Localization (l10n) + +Similar to the other chrome sections above, we also use `locale` URLs in the DevTools UI to load localized strings. This section applies to `*.dtd` (for use as entities within XUL / XHTML files) and `*.properties` (for use via runtime APIs) files. + +We currently have two sets of localized files: + +* `devtools/client/locales`: Strings used in the DevTools client (front-end UI) +* `devtools/shared/locales`: Strings used in either the DevTools server only, or shared with both the client and server + +### Packaging + +If you add a new l10n file (such as a new `*.dtd` or `*.properties` file), there should not be any additional packaging steps to perform, assuming the new file is placed in either of the 2 directories mentioned above. Each one contains a `jar.mn` which uses wildcards to package all files in the directory by default. + +### Usage + +Locale URLs differ somewhat based on whether they are in `client` or `shared`. While we would have preferred them to match the source tree path, the requirements of the `chrome://` protocol don't make that easy to do. + +Example: + +* File: `/devtools/client/locales/en-US/debugger.dtd` +* Usage: `chrome://devtools/locale/debugger.dtd` + +Example: + +* File: `/devtools/shared/locales/en-US/gcli.properties` +* Usage: `chrome://devtools-shared/locale/gcli.properties` + +### Guidelines + +Localization files should follow a set of guidelines aimed at making it easier for people to translate the labels in these files in many languages. + +[Find these guidelines on MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_content_best_practices). + +In particular, it's important to write self-explanatory comments for new keys, deleting unused keys, changing the key name when changing the meaning of a string, and more. So make sure you read through these guidelines should you have to modify a localization file in your patch. From 36bae69f18f1431d2a73751b0028e0c4672a703d Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 22 Mar 2017 14:48:00 +0800 Subject: [PATCH 269/300] Bug 1349485. P1 - devirtualize DecodedAudioDataSink. r=kikuo MozReview-Commit-ID: 7c24rJDaMwX --- dom/media/mediasink/AudioSinkWrapper.cpp | 2 +- dom/media/mediasink/AudioSinkWrapper.h | 8 ++--- dom/media/mediasink/DecodedAudioDataSink.cpp | 10 +++--- dom/media/mediasink/DecodedAudioDataSink.h | 34 +++++++++++--------- 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/dom/media/mediasink/AudioSinkWrapper.cpp b/dom/media/mediasink/AudioSinkWrapper.cpp index d7994c45ca246..517e8483b753d 100644 --- a/dom/media/mediasink/AudioSinkWrapper.cpp +++ b/dom/media/mediasink/AudioSinkWrapper.cpp @@ -4,8 +4,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "AudioSink.h" #include "AudioSinkWrapper.h" +#include "DecodedAudioDataSink.h" namespace mozilla { namespace media { diff --git a/dom/media/mediasink/AudioSinkWrapper.h b/dom/media/mediasink/AudioSinkWrapper.h index 46d402ee6e48d..7d2018f2409b1 100644 --- a/dom/media/mediasink/AudioSinkWrapper.h +++ b/dom/media/mediasink/AudioSinkWrapper.h @@ -22,7 +22,7 @@ template class MediaQueue; namespace media { -class AudioSink; +class DecodedAudioDataSink; /** * A wrapper around AudioSink to provide the interface of MediaSink. @@ -32,7 +32,7 @@ class AudioSinkWrapper : public MediaSink { class Creator { public: virtual ~Creator() {} - virtual AudioSink* Create() = 0; + virtual DecodedAudioDataSink* Create() = 0; }; // Wrap around a function object which creates AudioSinks. @@ -40,7 +40,7 @@ class AudioSinkWrapper : public MediaSink { class CreatorImpl : public Creator { public: explicit CreatorImpl(const Function& aFunc) : mFunction(aFunc) {} - AudioSink* Create() override { return mFunction(); } + DecodedAudioDataSink* Create() override { return mFunction(); } private: Function mFunction; }; @@ -89,7 +89,7 @@ class AudioSinkWrapper : public MediaSink { const RefPtr mOwnerThread; UniquePtr mCreator; - RefPtr mAudioSink; + RefPtr mAudioSink; RefPtr mEndPromise; bool mIsStarted; diff --git a/dom/media/mediasink/DecodedAudioDataSink.cpp b/dom/media/mediasink/DecodedAudioDataSink.cpp index 65fe6fa0f6652..deeba647bad20 100644 --- a/dom/media/mediasink/DecodedAudioDataSink.cpp +++ b/dom/media/mediasink/DecodedAudioDataSink.cpp @@ -38,8 +38,7 @@ DecodedAudioDataSink::DecodedAudioDataSink(AbstractThread* aThread, int64_t aStartTime, const AudioInfo& aInfo, dom::AudioChannel aChannel) - : AudioSink(aAudioQueue) - , mStartTime(aStartTime) + : mStartTime(aStartTime) , mLastGoodPosition(0) , mInfo(aInfo) , mChannel(aChannel) @@ -53,6 +52,7 @@ DecodedAudioDataSink::DecodedAudioDataSink(AbstractThread* aThread, , mFramesParsed(0) , mLastEndTime(0) , mIsAudioDataAudible(false) + , mAudioQueue(aAudioQueue) { bool resampling = MediaPrefs::AudioSinkResampling(); @@ -385,10 +385,10 @@ DecodedAudioDataSink::NotifyAudioNeeded() // Always ensure we have two processed frames pending to allow for processing // latency. - while (AudioQueue().GetSize() && (AudioQueue().IsFinished() || + while (mAudioQueue.GetSize() && (mAudioQueue.IsFinished() || mProcessedQueueLength < LOW_AUDIO_USECS || mProcessedQueue.GetSize() < 2)) { - RefPtr data = AudioQueue().PopFront(); + RefPtr data = mAudioQueue.PopFront(); // Ignore the element with 0 frames and try next. if (!data->mFrames) { @@ -491,7 +491,7 @@ DecodedAudioDataSink::NotifyAudioNeeded() } } - if (AudioQueue().IsFinished()) { + if (mAudioQueue.IsFinished()) { // We have reached the end of the data, drain the resampler. DrainConverter(); mProcessedQueue.Finish(); diff --git a/dom/media/mediasink/DecodedAudioDataSink.h b/dom/media/mediasink/DecodedAudioDataSink.h index 65917f8ce77cb..909c322ccf3ba 100644 --- a/dom/media/mediasink/DecodedAudioDataSink.h +++ b/dom/media/mediasink/DecodedAudioDataSink.h @@ -6,19 +6,19 @@ #if !defined(DecodedAudioDataSink_h__) #define DecodedAudioDataSink_h__ -#include "AudioSink.h" #include "AudioStream.h" #include "MediaEventSource.h" #include "MediaQueue.h" #include "MediaInfo.h" -#include "mozilla/RefPtr.h" -#include "nsISupportsImpl.h" +#include "MediaSink.h" #include "mozilla/dom/AudioChannelBinding.h" #include "mozilla/Atomics.h" #include "mozilla/Maybe.h" #include "mozilla/MozPromise.h" #include "mozilla/Monitor.h" +#include "mozilla/RefPtr.h" +#include "nsISupportsImpl.h" namespace mozilla { @@ -26,8 +26,10 @@ class AudioConverter; namespace media { -class DecodedAudioDataSink : public AudioSink, - private AudioStream::DataSource { +class DecodedAudioDataSink : private AudioStream::DataSource { + using PlaybackParams = MediaSink::PlaybackParams; + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DecodedAudioDataSink) + public: DecodedAudioDataSink(AbstractThread* aThread, MediaQueue& aAudioQueue, @@ -37,26 +39,26 @@ class DecodedAudioDataSink : public AudioSink, // Return a promise which will be resolved when DecodedAudioDataSink // finishes playing, or rejected if any error. - RefPtr Init(const PlaybackParams& aParams) override; + RefPtr Init(const PlaybackParams& aParams); /* * All public functions are not thread-safe. * Called on the task queue of MDSM only. */ - int64_t GetPosition() override; - int64_t GetEndTime() const override; + int64_t GetPosition(); + int64_t GetEndTime() const; // Check whether we've pushed more frames to the audio hardware than it has // played. - bool HasUnplayedFrames() override; + bool HasUnplayedFrames(); // Shut down the DecodedAudioDataSink's resources. - void Shutdown() override; + void Shutdown(); - void SetVolume(double aVolume) override; - void SetPlaybackRate(double aPlaybackRate) override; - void SetPreservesPitch(bool aPreservesPitch) override; - void SetPlaying(bool aPlaying) override; + void SetVolume(double aVolume); + void SetPlaybackRate(double aPlaybackRate); + void SetPreservesPitch(bool aPreservesPitch); + void SetPlaying(bool aPlaying); MediaEventSource& AudibleEvent() { return mAudibleEvent; @@ -143,7 +145,7 @@ class DecodedAudioDataSink : public AudioSink, MediaEventListener mAudioQueueListener; MediaEventListener mAudioQueueFinishListener; MediaEventListener mProcessedQueueListener; - // Number of frames processed from AudioQueue(). Used to determine gaps in + // Number of frames processed from mAudioQueue. Used to determine gaps in // the input stream. It indicates the time in frames since playback started // at the current input framerate. int64_t mFramesParsed; @@ -157,6 +159,8 @@ class DecodedAudioDataSink : public AudioSink, bool mIsAudioDataAudible; MediaEventProducer mAudibleEvent; + + MediaQueue& mAudioQueue; }; } // namespace media From 786dee69e607dacfa97661ebc8f2727928e9e22d Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 22 Mar 2017 14:49:46 +0800 Subject: [PATCH 270/300] Bug 1349485. P2 - remove dom/media/mediasink/AudioSink.h. r=kikuo MozReview-Commit-ID: A9YlwfrJTxB --- dom/media/mediasink/AudioSink.h | 69 --------------------------------- 1 file changed, 69 deletions(-) delete mode 100644 dom/media/mediasink/AudioSink.h diff --git a/dom/media/mediasink/AudioSink.h b/dom/media/mediasink/AudioSink.h deleted file mode 100644 index cce123e1bde9f..0000000000000 --- a/dom/media/mediasink/AudioSink.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#if !defined(AudioSink_h__) -#define AudioSink_h__ - -#include "mozilla/MozPromise.h" -#include "mozilla/RefPtr.h" -#include "nsISupportsImpl.h" - -#include "MediaSink.h" - -namespace mozilla { - -template class MediaQueue; - -namespace media { - -/* - * Define basic APIs for derived class instance to operate or obtain - * information from it. - */ -class AudioSink { -public: - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioSink) - AudioSink(MediaQueue& aAudioQueue) - : mAudioQueue(aAudioQueue) - {} - - typedef MediaSink::PlaybackParams PlaybackParams; - - // Return a promise which will be resolved when AudioSink finishes playing, - // or rejected if any error. - virtual RefPtr Init(const PlaybackParams& aParams) = 0; - - virtual int64_t GetEndTime() const = 0; - virtual int64_t GetPosition() = 0; - - // Check whether we've pushed more frames to the audio - // hardware than it has played. - virtual bool HasUnplayedFrames() = 0; - - // Shut down the AudioSink's resources. - virtual void Shutdown() = 0; - - // Change audio playback setting. - virtual void SetVolume(double aVolume) = 0; - virtual void SetPlaybackRate(double aPlaybackRate) = 0; - virtual void SetPreservesPitch(bool aPreservesPitch) = 0; - - // Change audio playback status pause/resume. - virtual void SetPlaying(bool aPlaying) = 0; - -protected: - virtual ~AudioSink() {} - - virtual MediaQueue& AudioQueue() const { - return mAudioQueue; - } - - MediaQueue& mAudioQueue; -}; - -} // namespace media -} // namespace mozilla - -#endif From f385cc8f8fe80d5b8cf5b9ad0c010f060499933f Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 22 Mar 2017 14:55:59 +0800 Subject: [PATCH 271/300] Bug 1349485. P3 - rename DecodedAudioDataSink to AudioSink. r=kikuo MozReview-Commit-ID: 3Irf6be322j --- dom/media/MediaDecoderStateMachine.cpp | 2 +- dom/media/mediasink/AudioSinkWrapper.h | 8 +-- dom/media/mediasink/DecodedAudioDataSink.cpp | 76 ++++++++++---------- dom/media/mediasink/DecodedAudioDataSink.h | 26 +++---- 4 files changed, 55 insertions(+), 57 deletions(-) diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp index 84b9cd7f7f18e..3199827054c9e 100644 --- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -2701,7 +2701,7 @@ MediaDecoderStateMachine::CreateAudioSink() RefPtr self = this; auto audioSinkCreator = [self] () { MOZ_ASSERT(self->OnTaskQueue()); - DecodedAudioDataSink* audioSink = new DecodedAudioDataSink( + AudioSink* audioSink = new AudioSink( self->mTaskQueue, self->mAudioQueue, self->GetMediaTime(), self->Info().mAudio, self->mAudioChannel); diff --git a/dom/media/mediasink/AudioSinkWrapper.h b/dom/media/mediasink/AudioSinkWrapper.h index 7d2018f2409b1..46d402ee6e48d 100644 --- a/dom/media/mediasink/AudioSinkWrapper.h +++ b/dom/media/mediasink/AudioSinkWrapper.h @@ -22,7 +22,7 @@ template class MediaQueue; namespace media { -class DecodedAudioDataSink; +class AudioSink; /** * A wrapper around AudioSink to provide the interface of MediaSink. @@ -32,7 +32,7 @@ class AudioSinkWrapper : public MediaSink { class Creator { public: virtual ~Creator() {} - virtual DecodedAudioDataSink* Create() = 0; + virtual AudioSink* Create() = 0; }; // Wrap around a function object which creates AudioSinks. @@ -40,7 +40,7 @@ class AudioSinkWrapper : public MediaSink { class CreatorImpl : public Creator { public: explicit CreatorImpl(const Function& aFunc) : mFunction(aFunc) {} - DecodedAudioDataSink* Create() override { return mFunction(); } + AudioSink* Create() override { return mFunction(); } private: Function mFunction; }; @@ -89,7 +89,7 @@ class AudioSinkWrapper : public MediaSink { const RefPtr mOwnerThread; UniquePtr mCreator; - RefPtr mAudioSink; + RefPtr mAudioSink; RefPtr mEndPromise; bool mIsStarted; diff --git a/dom/media/mediasink/DecodedAudioDataSink.cpp b/dom/media/mediasink/DecodedAudioDataSink.cpp index deeba647bad20..d3737fb171847 100644 --- a/dom/media/mediasink/DecodedAudioDataSink.cpp +++ b/dom/media/mediasink/DecodedAudioDataSink.cpp @@ -19,11 +19,9 @@ namespace mozilla { extern LazyLogModule gMediaDecoderLog; #define SINK_LOG(msg, ...) \ - MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, \ - ("DecodedAudioDataSink=%p " msg, this, ##__VA_ARGS__)) + MOZ_LOG(gMediaDecoderLog, LogLevel::Debug, ("AudioSink=%p " msg, this, ##__VA_ARGS__)) #define SINK_LOG_V(msg, ...) \ - MOZ_LOG(gMediaDecoderLog, LogLevel::Verbose, \ - ("DecodedAudioDataSink=%p " msg, this, ##__VA_ARGS__)) + MOZ_LOG(gMediaDecoderLog, LogLevel::Verbose, ("AudioSink=%p " msg, this, ##__VA_ARGS__)) namespace media { @@ -33,17 +31,17 @@ static const int64_t AUDIO_FUZZ_FRAMES = 1; // Amount of audio frames we will be processing ahead of use static const int32_t LOW_AUDIO_USECS = 300000; -DecodedAudioDataSink::DecodedAudioDataSink(AbstractThread* aThread, - MediaQueue& aAudioQueue, - int64_t aStartTime, - const AudioInfo& aInfo, - dom::AudioChannel aChannel) +AudioSink::AudioSink(AbstractThread* aThread, + MediaQueue& aAudioQueue, + int64_t aStartTime, + const AudioInfo& aInfo, + dom::AudioChannel aChannel) : mStartTime(aStartTime) , mLastGoodPosition(0) , mInfo(aInfo) , mChannel(aChannel) , mPlaying(true) - , mMonitor("DecodedAudioDataSink") + , mMonitor("AudioSink") , mWritten(0) , mErrored(false) , mPlaybackComplete(false) @@ -78,21 +76,21 @@ DecodedAudioDataSink::DecodedAudioDataSink(AbstractThread* aThread, : (MediaPrefs::AudioSinkForceStereo() ? 2 : mInfo.mChannels); } -DecodedAudioDataSink::~DecodedAudioDataSink() +AudioSink::~AudioSink() { } RefPtr -DecodedAudioDataSink::Init(const PlaybackParams& aParams) +AudioSink::Init(const PlaybackParams& aParams) { MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn()); mAudioQueueListener = mAudioQueue.PushEvent().Connect( - mOwnerThread, this, &DecodedAudioDataSink::OnAudioPushed); + mOwnerThread, this, &AudioSink::OnAudioPushed); mAudioQueueFinishListener = mAudioQueue.FinishEvent().Connect( - mOwnerThread, this, &DecodedAudioDataSink::NotifyAudioNeeded); + mOwnerThread, this, &AudioSink::NotifyAudioNeeded); mProcessedQueueListener = mProcessedQueue.PopEvent().Connect( - mOwnerThread, this, &DecodedAudioDataSink::OnAudioPopped); + mOwnerThread, this, &AudioSink::OnAudioPopped); // To ensure at least one audio packet will be popped from AudioQueue and // ready to be played. @@ -106,7 +104,7 @@ DecodedAudioDataSink::Init(const PlaybackParams& aParams) } int64_t -DecodedAudioDataSink::GetPosition() +AudioSink::GetPosition() { int64_t pos; if (mAudioStream && @@ -123,7 +121,7 @@ DecodedAudioDataSink::GetPosition() } bool -DecodedAudioDataSink::HasUnplayedFrames() +AudioSink::HasUnplayedFrames() { // Experimentation suggests that GetPositionInFrames() is zero-indexed, // so we need to add 1 here before comparing it to mWritten. @@ -137,7 +135,7 @@ DecodedAudioDataSink::HasUnplayedFrames() } void -DecodedAudioDataSink::Shutdown() +AudioSink::Shutdown() { MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn()); @@ -155,7 +153,7 @@ DecodedAudioDataSink::Shutdown() } void -DecodedAudioDataSink::SetVolume(double aVolume) +AudioSink::SetVolume(double aVolume) { if (mAudioStream) { mAudioStream->SetVolume(aVolume); @@ -163,7 +161,7 @@ DecodedAudioDataSink::SetVolume(double aVolume) } void -DecodedAudioDataSink::SetPlaybackRate(double aPlaybackRate) +AudioSink::SetPlaybackRate(double aPlaybackRate) { MOZ_ASSERT(aPlaybackRate != 0, "Don't set the playbackRate to 0 on AudioStream"); if (mAudioStream) { @@ -172,7 +170,7 @@ DecodedAudioDataSink::SetPlaybackRate(double aPlaybackRate) } void -DecodedAudioDataSink::SetPreservesPitch(bool aPreservesPitch) +AudioSink::SetPreservesPitch(bool aPreservesPitch) { if (mAudioStream) { mAudioStream->SetPreservesPitch(aPreservesPitch); @@ -180,7 +178,7 @@ DecodedAudioDataSink::SetPreservesPitch(bool aPreservesPitch) } void -DecodedAudioDataSink::SetPlaying(bool aPlaying) +AudioSink::SetPlaying(bool aPlaying) { if (!mAudioStream || mPlaying == aPlaying || mPlaybackComplete) { return; @@ -195,7 +193,7 @@ DecodedAudioDataSink::SetPlaying(bool aPlaying) } nsresult -DecodedAudioDataSink::InitializeAudioStream(const PlaybackParams& aParams) +AudioSink::InitializeAudioStream(const PlaybackParams& aParams) { mAudioStream = new AudioStream(*this); // When AudioQueue is empty, there is no way to know the channel layout of @@ -224,7 +222,7 @@ DecodedAudioDataSink::InitializeAudioStream(const PlaybackParams& aParams) } int64_t -DecodedAudioDataSink::GetEndTime() const +AudioSink::GetEndTime() const { int64_t written; { @@ -242,7 +240,7 @@ DecodedAudioDataSink::GetEndTime() const } UniquePtr -DecodedAudioDataSink::PopFrames(uint32_t aFrames) +AudioSink::PopFrames(uint32_t aFrames) { class Chunk : public AudioStream::Chunk { public: @@ -337,14 +335,14 @@ DecodedAudioDataSink::PopFrames(uint32_t aFrames) } bool -DecodedAudioDataSink::Ended() const +AudioSink::Ended() const { // Return true when error encountered so AudioStream can start draining. return mProcessedQueue.IsFinished() || mErrored; } void -DecodedAudioDataSink::Drained() +AudioSink::Drained() { SINK_LOG("Drained"); mPlaybackComplete = true; @@ -352,7 +350,7 @@ DecodedAudioDataSink::Drained() } void -DecodedAudioDataSink::CheckIsAudible(const AudioData* aData) +AudioSink::CheckIsAudible(const AudioData* aData) { MOZ_ASSERT(aData); @@ -364,21 +362,21 @@ DecodedAudioDataSink::CheckIsAudible(const AudioData* aData) } void -DecodedAudioDataSink::OnAudioPopped(const RefPtr& aSample) +AudioSink::OnAudioPopped(const RefPtr& aSample) { SINK_LOG_V("AudioStream has used an audio packet."); NotifyAudioNeeded(); } void -DecodedAudioDataSink::OnAudioPushed(const RefPtr& aSample) +AudioSink::OnAudioPushed(const RefPtr& aSample) { SINK_LOG_V("One new audio packet available."); NotifyAudioNeeded(); } void -DecodedAudioDataSink::NotifyAudioNeeded() +AudioSink::NotifyAudioNeeded() { MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn(), "Not called from the owner's thread"); @@ -413,7 +411,7 @@ DecodedAudioDataSink::NotifyAudioNeeded() uint32_t newRate = data->mRate; CheckedInt64 result = SaferMultDiv(mFramesParsed, newRate, oldRate); if (!result.isValid()) { - NS_WARNING("Int overflow in DecodedAudioDataSink"); + NS_WARNING("Int overflow in AudioSink"); mErrored = true; return; } @@ -436,7 +434,7 @@ DecodedAudioDataSink::NotifyAudioNeeded() CheckedInt64 missingFrames = sampleTime - mFramesParsed; if (!missingFrames.isValid()) { - NS_WARNING("Int overflow in DecodedAudioDataSink"); + NS_WARNING("Int overflow in AudioSink"); mErrored = true; return; } @@ -453,7 +451,7 @@ DecodedAudioDataSink::NotifyAudioNeeded() missingFrames = SaferMultDiv(missingFrames.value(), mOutputRate, data->mRate); if (!missingFrames.isValid()) { - NS_WARNING("Int overflow in DecodedAudioDataSink"); + NS_WARNING("Int overflow in AudioSink"); mErrored = true; return; } @@ -464,7 +462,7 @@ DecodedAudioDataSink::NotifyAudioNeeded() if (missingFrames.value()) { AlignedAudioBuffer silenceData(missingFrames.value() * mOutputChannels); if (!silenceData) { - NS_WARNING("OOM in DecodedAudioDataSink"); + NS_WARNING("OOM in AudioSink"); mErrored = true; return; } @@ -499,7 +497,7 @@ DecodedAudioDataSink::NotifyAudioNeeded() } uint32_t -DecodedAudioDataSink::PushProcessedAudio(AudioData* aData) +AudioSink::PushProcessedAudio(AudioData* aData) { if (!aData || !aData->mFrames) { return 0; @@ -510,7 +508,7 @@ DecodedAudioDataSink::PushProcessedAudio(AudioData* aData) } already_AddRefed -DecodedAudioDataSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer, +AudioSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer, AudioData* aReference) { uint32_t frames = aBuffer.Length() / mOutputChannels; @@ -519,7 +517,7 @@ DecodedAudioDataSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer, } CheckedInt64 duration = FramesToUsecs(frames, mOutputRate); if (!duration.isValid()) { - NS_WARNING("Int overflow in DecodedAudioDataSink"); + NS_WARNING("Int overflow in AudioSink"); mErrored = true; return nullptr; } @@ -535,7 +533,7 @@ DecodedAudioDataSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer, } uint32_t -DecodedAudioDataSink::DrainConverter(uint32_t aMaxFrames) +AudioSink::DrainConverter(uint32_t aMaxFrames) { MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn()); diff --git a/dom/media/mediasink/DecodedAudioDataSink.h b/dom/media/mediasink/DecodedAudioDataSink.h index 909c322ccf3ba..5001cafba315a 100644 --- a/dom/media/mediasink/DecodedAudioDataSink.h +++ b/dom/media/mediasink/DecodedAudioDataSink.h @@ -3,8 +3,8 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#if !defined(DecodedAudioDataSink_h__) -#define DecodedAudioDataSink_h__ +#ifndef AudioSink_h__ +#define AudioSink_h__ #include "AudioStream.h" #include "MediaEventSource.h" @@ -26,18 +26,18 @@ class AudioConverter; namespace media { -class DecodedAudioDataSink : private AudioStream::DataSource { +class AudioSink : private AudioStream::DataSource { using PlaybackParams = MediaSink::PlaybackParams; - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DecodedAudioDataSink) + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioSink) public: - DecodedAudioDataSink(AbstractThread* aThread, - MediaQueue& aAudioQueue, - int64_t aStartTime, - const AudioInfo& aInfo, - dom::AudioChannel aChannel); + AudioSink(AbstractThread* aThread, + MediaQueue& aAudioQueue, + int64_t aStartTime, + const AudioInfo& aInfo, + dom::AudioChannel aChannel); - // Return a promise which will be resolved when DecodedAudioDataSink + // Return a promise which will be resolved when AudioSink // finishes playing, or rejected if any error. RefPtr Init(const PlaybackParams& aParams); @@ -52,7 +52,7 @@ class DecodedAudioDataSink : private AudioStream::DataSource { // played. bool HasUnplayedFrames(); - // Shut down the DecodedAudioDataSink's resources. + // Shut down the AudioSink's resources. void Shutdown(); void SetVolume(double aVolume); @@ -65,7 +65,7 @@ class DecodedAudioDataSink : private AudioStream::DataSource { } private: - virtual ~DecodedAudioDataSink(); + virtual ~AudioSink(); // Allocate and initialize mAudioStream. Returns NS_OK on success. nsresult InitializeAudioStream(const PlaybackParams& aParams); @@ -166,4 +166,4 @@ class DecodedAudioDataSink : private AudioStream::DataSource { } // namespace media } // namespace mozilla -#endif +#endif // AudioSink_h__ From f93f19290128670d44eab0bfc59164c045754803 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 22 Mar 2017 15:03:38 +0800 Subject: [PATCH 272/300] Bug 1349485. P4 - rename DecodedAudioDataSink.* to AudioSink.*. r=kikuo MozReview-Commit-ID: KYbJwTpUiHZ --- dom/media/MediaDecoderStateMachine.cpp | 2 +- dom/media/mediasink/{DecodedAudioDataSink.cpp => AudioSink.cpp} | 2 +- dom/media/mediasink/{DecodedAudioDataSink.h => AudioSink.h} | 0 dom/media/mediasink/AudioSinkWrapper.cpp | 2 +- dom/media/mediasink/moz.build | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename dom/media/mediasink/{DecodedAudioDataSink.cpp => AudioSink.cpp} (99%) rename dom/media/mediasink/{DecodedAudioDataSink.h => AudioSink.h} (100%) diff --git a/dom/media/MediaDecoderStateMachine.cpp b/dom/media/MediaDecoderStateMachine.cpp index 3199827054c9e..0b25f0459559c 100644 --- a/dom/media/MediaDecoderStateMachine.cpp +++ b/dom/media/MediaDecoderStateMachine.cpp @@ -15,8 +15,8 @@ #include "gfx2DGlue.h" +#include "mediasink/AudioSink.h" #include "mediasink/AudioSinkWrapper.h" -#include "mediasink/DecodedAudioDataSink.h" #include "mediasink/DecodedStream.h" #include "mediasink/OutputStreamManager.h" #include "mediasink/VideoSink.h" diff --git a/dom/media/mediasink/DecodedAudioDataSink.cpp b/dom/media/mediasink/AudioSink.cpp similarity index 99% rename from dom/media/mediasink/DecodedAudioDataSink.cpp rename to dom/media/mediasink/AudioSink.cpp index d3737fb171847..a92d8294d7086 100644 --- a/dom/media/mediasink/DecodedAudioDataSink.cpp +++ b/dom/media/mediasink/AudioSink.cpp @@ -6,7 +6,7 @@ #include "nsPrintfCString.h" #include "MediaQueue.h" -#include "DecodedAudioDataSink.h" +#include "AudioSink.h" #include "VideoUtils.h" #include "AudioConverter.h" diff --git a/dom/media/mediasink/DecodedAudioDataSink.h b/dom/media/mediasink/AudioSink.h similarity index 100% rename from dom/media/mediasink/DecodedAudioDataSink.h rename to dom/media/mediasink/AudioSink.h diff --git a/dom/media/mediasink/AudioSinkWrapper.cpp b/dom/media/mediasink/AudioSinkWrapper.cpp index 517e8483b753d..d7994c45ca246 100644 --- a/dom/media/mediasink/AudioSinkWrapper.cpp +++ b/dom/media/mediasink/AudioSinkWrapper.cpp @@ -4,8 +4,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "AudioSink.h" #include "AudioSinkWrapper.h" -#include "DecodedAudioDataSink.h" namespace mozilla { namespace media { diff --git a/dom/media/mediasink/moz.build b/dom/media/mediasink/moz.build index c093413744567..b534c93b37c1a 100644 --- a/dom/media/mediasink/moz.build +++ b/dom/media/mediasink/moz.build @@ -5,8 +5,8 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. UNIFIED_SOURCES += [ + 'AudioSink.cpp', 'AudioSinkWrapper.cpp', - 'DecodedAudioDataSink.cpp', 'DecodedStream.cpp', 'OutputStreamManager.cpp', 'VideoSink.cpp', From 29f3d53e9a0fd4dcc1fe7c9dcd30f7d669bbb43d Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 22 Mar 2017 15:13:10 +0800 Subject: [PATCH 273/300] Bug 1349485. P5 - make AudioSink a non-ref-counting type. r=kikuo MozReview-Commit-ID: EJmSTwkSdX6 --- dom/media/mediasink/AudioSink.h | 5 ++--- dom/media/mediasink/AudioSinkWrapper.cpp | 2 +- dom/media/mediasink/AudioSinkWrapper.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/dom/media/mediasink/AudioSink.h b/dom/media/mediasink/AudioSink.h index 5001cafba315a..eb16bc014e54c 100644 --- a/dom/media/mediasink/AudioSink.h +++ b/dom/media/mediasink/AudioSink.h @@ -28,7 +28,6 @@ namespace media { class AudioSink : private AudioStream::DataSource { using PlaybackParams = MediaSink::PlaybackParams; - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioSink) public: AudioSink(AbstractThread* aThread, @@ -37,6 +36,8 @@ class AudioSink : private AudioStream::DataSource { const AudioInfo& aInfo, dom::AudioChannel aChannel); + ~AudioSink(); + // Return a promise which will be resolved when AudioSink // finishes playing, or rejected if any error. RefPtr Init(const PlaybackParams& aParams); @@ -65,8 +66,6 @@ class AudioSink : private AudioStream::DataSource { } private: - virtual ~AudioSink(); - // Allocate and initialize mAudioStream. Returns NS_OK on success. nsresult InitializeAudioStream(const PlaybackParams& aParams); diff --git a/dom/media/mediasink/AudioSinkWrapper.cpp b/dom/media/mediasink/AudioSinkWrapper.cpp index d7994c45ca246..e078bf5652c3a 100644 --- a/dom/media/mediasink/AudioSinkWrapper.cpp +++ b/dom/media/mediasink/AudioSinkWrapper.cpp @@ -190,7 +190,7 @@ AudioSinkWrapper::Start(int64_t aStartTime, const MediaInfo& aInfo) mAudioEnded = !aInfo.HasAudio(); if (aInfo.HasAudio()) { - mAudioSink = mCreator->Create(); + mAudioSink.reset(mCreator->Create()); mEndPromise = mAudioSink->Init(mParams); mEndPromise->Then( diff --git a/dom/media/mediasink/AudioSinkWrapper.h b/dom/media/mediasink/AudioSinkWrapper.h index 46d402ee6e48d..785cf899a4325 100644 --- a/dom/media/mediasink/AudioSinkWrapper.h +++ b/dom/media/mediasink/AudioSinkWrapper.h @@ -89,7 +89,7 @@ class AudioSinkWrapper : public MediaSink { const RefPtr mOwnerThread; UniquePtr mCreator; - RefPtr mAudioSink; + UniquePtr mAudioSink; RefPtr mEndPromise; bool mIsStarted; From 4136d76613e1e316e80b9cb5762d2bb2042440d1 Mon Sep 17 00:00:00 2001 From: Jon Coppeard Date: Wed, 22 Mar 2017 17:30:50 +0000 Subject: [PATCH 274/300] Bug 1341044 - Rename the GC's 'zone group' concept to 'sweep group' r=sfink --- js/ipc/JavaScriptChild.cpp | 4 +- js/src/gc/GCRuntime.h | 28 +-- js/src/gc/Marking.cpp | 2 +- js/src/gc/Statistics.cpp | 2 +- js/src/gc/Statistics.h | 2 +- js/src/gc/Zone.cpp | 10 +- js/src/gc/Zone.h | 16 +- js/src/jsapi-tests/testGCFinalizeCallback.cpp | 2 +- js/src/jsapi-tests/testWeakMap.cpp | 4 +- js/src/jsapi.cpp | 8 +- js/src/jsapi.h | 8 +- js/src/jsgc.cpp | 172 +++++++++--------- js/src/jsgcinlines.h | 10 +- js/src/jsweakmap.cpp | 2 +- js/src/vm/Runtime.h | 2 +- js/xpconnect/src/XPCJSContext.cpp | 6 +- js/xpconnect/src/xpcprivate.h | 2 +- 17 files changed, 140 insertions(+), 140 deletions(-) diff --git a/js/ipc/JavaScriptChild.cpp b/js/ipc/JavaScriptChild.cpp index 69bc8ded243f3..fecdcd060a1b9 100644 --- a/js/ipc/JavaScriptChild.cpp +++ b/js/ipc/JavaScriptChild.cpp @@ -35,7 +35,7 @@ TraceChild(JSTracer* trc, void* data) JavaScriptChild::~JavaScriptChild() { JSContext* cx = dom::danger::GetJSContext(); - JS_RemoveWeakPointerZoneGroupCallback(cx, UpdateChildWeakPointersBeforeSweepingZoneGroup); + JS_RemoveWeakPointerZonesCallback(cx, UpdateChildWeakPointersBeforeSweepingZoneGroup); JS_RemoveExtraGCRootsTracer(cx, TraceChild, this); } @@ -48,7 +48,7 @@ JavaScriptChild::init() return false; JSContext* cx = dom::danger::GetJSContext(); - JS_AddWeakPointerZoneGroupCallback(cx, UpdateChildWeakPointersBeforeSweepingZoneGroup, this); + JS_AddWeakPointerZonesCallback(cx, UpdateChildWeakPointersBeforeSweepingZoneGroup, this); JS_AddExtraGCRootsTracer(cx, TraceChild, this); return true; } diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h index f8a8777ad3808..5e90f60e48f0f 100644 --- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -788,9 +788,9 @@ class GCRuntime void callObjectsTenuredCallback(); MOZ_MUST_USE bool addFinalizeCallback(JSFinalizeCallback callback, void* data); void removeFinalizeCallback(JSFinalizeCallback func); - MOZ_MUST_USE bool addWeakPointerZoneGroupCallback(JSWeakPointerZoneGroupCallback callback, + MOZ_MUST_USE bool addWeakPointerZonesCallback(JSWeakPointerZonesCallback callback, void* data); - void removeWeakPointerZoneGroupCallback(JSWeakPointerZoneGroupCallback callback); + void removeWeakPointerZonesCallback(JSWeakPointerZonesCallback callback); MOZ_MUST_USE bool addWeakPointerCompartmentCallback(JSWeakPointerCompartmentCallback callback, void* data); void removeWeakPointerCompartmentCallback(JSWeakPointerCompartmentCallback callback); @@ -802,7 +802,7 @@ class GCRuntime void setFullCompartmentChecks(bool enable); - JS::Zone* getCurrentZoneGroup() { return currentZoneGroup; } + JS::Zone* getCurrentSweepGroup() { return currentSweepGroup; } void setFoundBlackGrayEdges(TenuredCell& target) { AutoEnterOOMUnsafeRegion oomUnsafe; if (!foundBlackGrayEdges.ref().append(&target)) @@ -978,13 +978,13 @@ class GCRuntime void markAllGrayReferences(gcstats::Phase phase); void beginSweepPhase(bool lastGC, AutoLockForExclusiveAccess& lock); - void findZoneGroups(AutoLockForExclusiveAccess& lock); + void groupZonesForSweeping(AutoLockForExclusiveAccess& lock); MOZ_MUST_USE bool findInterZoneEdges(); - void getNextZoneGroup(); - void endMarkingZoneGroup(); - void beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock); + void getNextSweepGroup(); + void endMarkingSweepGroup(); + void beginSweepingSweepGroup(AutoLockForExclusiveAccess& lock); bool shouldReleaseObservedTypes(); - void endSweepingZoneGroup(); + void endSweepingSweepGroup(); IncrementalProgress sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock); void endSweepPhase(bool lastGC, AutoLockForExclusiveAccess& lock); bool allCCVisibleZonesWereCollected() const; @@ -1024,7 +1024,7 @@ class GCRuntime #endif void callFinalizeCallbacks(FreeOp* fop, JSFinalizeStatus status) const; - void callWeakPointerZoneGroupCallbacks() const; + void callWeakPointerZonesCallbacks() const; void callWeakPointerCompartmentCallbacks(JSCompartment* comp) const; public: @@ -1196,14 +1196,14 @@ class GCRuntime ActiveThreadOrGCTaskData blocksToFreeAfterSweeping; private: - /* Index of current zone group (for stats). */ - ActiveThreadData zoneGroupIndex; + /* Index of current sweep group (for stats). */ + ActiveThreadData sweepGroupIndex; /* * Incremental sweep state. */ - ActiveThreadData zoneGroups; - ActiveThreadOrGCTaskData currentZoneGroup; + ActiveThreadData sweepGroups; + ActiveThreadOrGCTaskData currentSweepGroup; ActiveThreadData sweepingTypes; ActiveThreadData finalizePhase; ActiveThreadData sweepZone; @@ -1295,7 +1295,7 @@ class GCRuntime Callback gcDoCycleCollectionCallback; Callback tenuredCallback; CallbackVector finalizeCallbacks; - CallbackVector updateWeakPointerZoneGroupCallbacks; + CallbackVector updateWeakPointerZonesCallbacks; CallbackVector updateWeakPointerCompartmentCallbacks; MemoryCounter mallocCounter; diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index 70b6419f2aee2..22839c291ce4f 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -2451,7 +2451,7 @@ GCMarker::enterWeakMarkingMode() if (weakMapAction() == ExpandWeakMaps) { tag_ = TracerKindTag::WeakMarking; - for (GCZoneGroupIter zone(runtime()); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(runtime()); !zone.done(); zone.next()) { for (WeakMapBase* m : zone->gcWeakMapList()) { if (m->marked) (void) m->markIteratively(this); diff --git a/js/src/gc/Statistics.cpp b/js/src/gc/Statistics.cpp index 519c393aa6d15..8065fdc8b7a4e 100644 --- a/js/src/gc/Statistics.cpp +++ b/js/src/gc/Statistics.cpp @@ -164,7 +164,7 @@ static const PhaseInfo phases[] = { { PHASE_SWEEP_MARK_GRAY, "Mark Gray", PHASE_SWEEP_MARK, 15 }, { PHASE_SWEEP_MARK_GRAY_WEAK, "Mark Gray and Weak", PHASE_SWEEP_MARK, 16 }, { PHASE_FINALIZE_START, "Finalize Start Callbacks", PHASE_SWEEP, 17 }, - { PHASE_WEAK_ZONEGROUP_CALLBACK, "Per-Slice Weak Callback", PHASE_FINALIZE_START, 57 }, + { PHASE_WEAK_ZONES_CALLBACK, "Per-Slice Weak Callback", PHASE_FINALIZE_START, 57 }, { PHASE_WEAK_COMPARTMENT_CALLBACK, "Per-Compartment Weak Callback", PHASE_FINALIZE_START, 58 }, { PHASE_SWEEP_ATOMS, "Sweep Atoms", PHASE_SWEEP, 18 }, { PHASE_SWEEP_COMPARTMENTS, "Sweep Compartments", PHASE_SWEEP, 20 }, diff --git a/js/src/gc/Statistics.h b/js/src/gc/Statistics.h index 9af2245ba9017..4957b9c265613 100644 --- a/js/src/gc/Statistics.h +++ b/js/src/gc/Statistics.h @@ -49,7 +49,7 @@ enum Phase : uint8_t { PHASE_SWEEP_MARK_GRAY, PHASE_SWEEP_MARK_GRAY_WEAK, PHASE_FINALIZE_START, - PHASE_WEAK_ZONEGROUP_CALLBACK, + PHASE_WEAK_ZONES_CALLBACK, PHASE_WEAK_COMPARTMENT_CALLBACK, PHASE_SWEEP_ATOMS, PHASE_SWEEP_COMPARTMENTS, diff --git a/js/src/gc/Zone.cpp b/js/src/gc/Zone.cpp index 67030ea4d7ca4..b8dade6039e81 100644 --- a/js/src/gc/Zone.cpp +++ b/js/src/gc/Zone.cpp @@ -37,7 +37,7 @@ JS::Zone::Zone(JSRuntime* rt, ZoneGroup* group) gcWeakRefs_(group), weakCaches_(group), gcWeakKeys_(group, SystemAllocPolicy(), rt->randomHashCodeScrambler()), - gcZoneGroupEdges_(group), + gcSweepGroupEdges_(group), hasDeadProxies_(group), typeDescrObjects_(group, this, SystemAllocPolicy()), markedAtoms_(group), @@ -50,7 +50,7 @@ JS::Zone::Zone(JSRuntime* rt, ZoneGroup* group) data(group, nullptr), isSystem(group, false), #ifdef DEBUG - gcLastZoneGroupIndex(group, 0), + gcLastSweepGroupIndex(group, 0), #endif jitZone_(group, nullptr), gcState_(NoGC), @@ -90,7 +90,7 @@ bool Zone::init(bool isSystemArg) { isSystem = isSystemArg; return uniqueIds().init() && - gcZoneGroupEdges().init() && + gcSweepGroupEdges().init() && gcWeakKeys().init() && typeDescrObjects().init() && markedAtoms().init(); @@ -159,8 +159,8 @@ Zone::sweepBreakpoints(FreeOp* fop) GCPtrNativeObject& dbgobj = bp->debugger->toJSObjectRef(); // If we are sweeping, then we expect the script and the - // debugger object to be swept in the same zone group, except if - // the breakpoint was added after we computed the zone + // debugger object to be swept in the same sweep group, except + // if the breakpoint was added after we computed the sweep // groups. In this case both script and debugger object must be // live. MOZ_ASSERT_IF(isGCSweeping() && dbgobj->zone()->isCollecting(), diff --git a/js/src/gc/Zone.h b/js/src/gc/Zone.h index c9874caa86d5a..7b6b87e7954ac 100644 --- a/js/src/gc/Zone.h +++ b/js/src/gc/Zone.h @@ -270,9 +270,9 @@ struct Zone : public JS::shadow::Zone, void prepareForCompacting(); #ifdef DEBUG - // For testing purposes, return the index of the zone group which this zone + // For testing purposes, return the index of the sweep group which this zone // was swept in in the last GC. - unsigned lastZoneGroupIndex() { return gcLastZoneGroupIndex; } + unsigned lastSweepGroupIndex() { return gcLastSweepGroupIndex; } #endif using DebuggerVector = js::Vector; @@ -348,7 +348,7 @@ struct Zone : public JS::shadow::Zone, WeakEdges& gcWeakRefs() { return gcWeakRefs_.ref(); } private: - // List of non-ephemeron weak containers to sweep during beginSweepingZoneGroup. + // List of non-ephemeron weak containers to sweep during beginSweepingSweepGroup. js::ZoneGroupData>> weakCaches_; public: mozilla::LinkedList>& weakCaches() { return weakCaches_.ref(); } @@ -368,16 +368,16 @@ struct Zone : public JS::shadow::Zone, private: // A set of edges from this zone to other zones. // - // This is used during GC while calculating zone groups to record edges that - // can't be determined by examining this zone by itself. - js::ZoneGroupData gcZoneGroupEdges_; + // This is used during GC while calculating sweep groups to record edges + // that can't be determined by examining this zone by itself. + js::ZoneGroupData gcSweepGroupEdges_; // Zones with dead proxies require an extra scan through the wrapper map, // so track whether any dead proxies are known to exist. js::ZoneGroupData hasDeadProxies_; public: - ZoneSet& gcZoneGroupEdges() { return gcZoneGroupEdges_.ref(); } + ZoneSet& gcSweepGroupEdges() { return gcSweepGroupEdges_.ref(); } bool hasDeadProxies() { return hasDeadProxies_; } void setHasDeadProxies(bool b) { hasDeadProxies_ = b; } @@ -485,7 +485,7 @@ struct Zone : public JS::shadow::Zone, } #ifdef DEBUG - js::ZoneGroupData gcLastZoneGroupIndex; + js::ZoneGroupData gcLastSweepGroupIndex; #endif static js::HashNumber UniqueIdToHash(uint64_t uid) { diff --git a/js/src/jsapi-tests/testGCFinalizeCallback.cpp b/js/src/jsapi-tests/testGCFinalizeCallback.cpp index 95fac3d59959b..1826487bef324 100644 --- a/js/src/jsapi-tests/testGCFinalizeCallback.cpp +++ b/js/src/jsapi-tests/testGCFinalizeCallback.cpp @@ -175,7 +175,7 @@ bool checkMultipleGroups() bool checkFinalizeStatus() { /* - * The finalize callback should be called twice for each zone group + * The finalize callback should be called twice for each sweep group * finalized, with status JSFINALIZE_GROUP_START and JSFINALIZE_GROUP_END, * and then once more with JSFINALIZE_COLLECTION_END. */ diff --git a/js/src/jsapi-tests/testWeakMap.cpp b/js/src/jsapi-tests/testWeakMap.cpp index 37a272817df47..a4540c11535d3 100644 --- a/js/src/jsapi-tests/testWeakMap.cpp +++ b/js/src/jsapi-tests/testWeakMap.cpp @@ -102,7 +102,7 @@ BEGIN_TEST(testWeakMap_keyDelegates) while (JS::IsIncrementalGCInProgress(cx)) cx->runtime()->gc.debugGCSlice(budget); #ifdef DEBUG - CHECK(map->zone()->lastZoneGroupIndex() < delegateRoot->zone()->lastZoneGroupIndex()); + CHECK(map->zone()->lastSweepGroupIndex() < delegateRoot->zone()->lastSweepGroupIndex()); #endif /* Add our entry to the weakmap. */ @@ -124,7 +124,7 @@ BEGIN_TEST(testWeakMap_keyDelegates) * necessary because of the presence of the delegate and the CCW. */ #ifdef DEBUG - CHECK(map->zone()->lastZoneGroupIndex() == delegateRoot->zone()->lastZoneGroupIndex()); + CHECK(map->zone()->lastSweepGroupIndex() == delegateRoot->zone()->lastSweepGroupIndex()); #endif /* Check that when the delegate becomes unreachable the entry is removed. */ diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 7b8278820e796..80484310e513b 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1382,16 +1382,16 @@ JS_RemoveFinalizeCallback(JSContext* cx, JSFinalizeCallback cb) } JS_PUBLIC_API(bool) -JS_AddWeakPointerZoneGroupCallback(JSContext* cx, JSWeakPointerZoneGroupCallback cb, void* data) +JS_AddWeakPointerZonesCallback(JSContext* cx, JSWeakPointerZonesCallback cb, void* data) { AssertHeapIsIdle(); - return cx->runtime()->gc.addWeakPointerZoneGroupCallback(cb, data); + return cx->runtime()->gc.addWeakPointerZonesCallback(cb, data); } JS_PUBLIC_API(void) -JS_RemoveWeakPointerZoneGroupCallback(JSContext* cx, JSWeakPointerZoneGroupCallback cb) +JS_RemoveWeakPointerZonesCallback(JSContext* cx, JSWeakPointerZonesCallback cb) { - cx->runtime()->gc.removeWeakPointerZoneGroupCallback(cb); + cx->runtime()->gc.removeWeakPointerZonesCallback(cb); } JS_PUBLIC_API(bool) diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 411aaf3bb9f54..bfbd82d0961ff 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -585,7 +585,7 @@ typedef void (* JSFinalizeCallback)(JSFreeOp* fop, JSFinalizeStatus status, bool isZoneGC, void* data); typedef void -(* JSWeakPointerZoneGroupCallback)(JSContext* cx, void* data); +(* JSWeakPointerZonesCallback)(JSContext* cx, void* data); typedef void (* JSWeakPointerCompartmentCallback)(JSContext* cx, JSCompartment* comp, void* data); @@ -1720,7 +1720,7 @@ JS_RemoveFinalizeCallback(JSContext* cx, JSFinalizeCallback cb); * about. * * Since sweeping is incremental, we have several callbacks to avoid repeatedly - * having to visit all embedder structures. The WeakPointerZoneGroupCallback is + * having to visit all embedder structures. The WeakPointerZonesCallback is * called once for each strongly connected group of zones, whereas the * WeakPointerCompartmentCallback is called once for each compartment that is * visited while sweeping. Structures that cannot contain references in more @@ -1739,10 +1739,10 @@ JS_RemoveFinalizeCallback(JSContext* cx, JSFinalizeCallback cb); */ extern JS_PUBLIC_API(bool) -JS_AddWeakPointerZoneGroupCallback(JSContext* cx, JSWeakPointerZoneGroupCallback cb, void* data); +JS_AddWeakPointerZonesCallback(JSContext* cx, JSWeakPointerZonesCallback cb, void* data); extern JS_PUBLIC_API(void) -JS_RemoveWeakPointerZoneGroupCallback(JSContext* cx, JSWeakPointerZoneGroupCallback cb); +JS_RemoveWeakPointerZonesCallback(JSContext* cx, JSWeakPointerZonesCallback cb); extern JS_PUBLIC_API(bool) JS_AddWeakPointerCompartmentCallback(JSContext* cx, JSWeakPointerCompartmentCallback cb, diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 9d8bde6567749..7257455193cea 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -80,12 +80,12 @@ * * Slice n+1: Sweep: Mark objects in unswept zones that were newly * identified as alive (see below). Then sweep more zone - * groups. + * sweep groups. * * ... JS code runs ... * * Slice n+2: Sweep: Mark objects in unswept zones that were newly - * identified as alive. Then sweep more zone groups. + * identified as alive. Then sweep more zones. * * ... JS code runs ... * @@ -161,7 +161,7 @@ * conditions to change such that incremental collection is no longer safe. In * this case, the collection is 'reset' by ResetIncrementalGC(). If we are in * the mark state, this just stops marking, but if we have started sweeping - * already, we continue until we have swept the current zone group. Following a + * already, we continue until we have swept the current sweep group. Following a * reset, a new non-incremental collection is started. * * Compacting GC @@ -838,9 +838,9 @@ GCRuntime::GCRuntime(JSRuntime* rt) : lastMarkSlice(false), sweepOnBackgroundThread(false), blocksToFreeAfterSweeping((size_t) JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE), - zoneGroupIndex(0), - zoneGroups(nullptr), - currentZoneGroup(nullptr), + sweepGroupIndex(0), + sweepGroups(nullptr), + currentSweepGroup(nullptr), sweepZone(nullptr), sweepKind(AllocKind::FIRST), abortSweepAfterCurrentGroup(false), @@ -1420,27 +1420,27 @@ GCRuntime::callFinalizeCallbacks(FreeOp* fop, JSFinalizeStatus status) const } bool -GCRuntime::addWeakPointerZoneGroupCallback(JSWeakPointerZoneGroupCallback callback, void* data) +GCRuntime::addWeakPointerZonesCallback(JSWeakPointerZonesCallback callback, void* data) { - return updateWeakPointerZoneGroupCallbacks.ref().append( - Callback(callback, data)); + return updateWeakPointerZonesCallbacks.ref().append( + Callback(callback, data)); } void -GCRuntime::removeWeakPointerZoneGroupCallback(JSWeakPointerZoneGroupCallback callback) +GCRuntime::removeWeakPointerZonesCallback(JSWeakPointerZonesCallback callback) { - for (auto& p : updateWeakPointerZoneGroupCallbacks.ref()) { + for (auto& p : updateWeakPointerZonesCallbacks.ref()) { if (p.op == callback) { - updateWeakPointerZoneGroupCallbacks.ref().erase(&p); + updateWeakPointerZonesCallbacks.ref().erase(&p); break; } } } void -GCRuntime::callWeakPointerZoneGroupCallbacks() const +GCRuntime::callWeakPointerZonesCallbacks() const { - for (auto const& p : updateWeakPointerZoneGroupCallbacks.ref()) + for (auto const& p : updateWeakPointerZonesCallbacks.ref()) p.op(TlsContext.get(), p.data); } @@ -2561,7 +2561,7 @@ GCRuntime::updateRuntimePointersToRelocatedCells(AutoLockForExclusiveAccess& loc blocksToFreeAfterSweeping.ref().freeAll(); // Call callbacks to get the rest of the system to fixup other untraced pointers. - callWeakPointerZoneGroupCallbacks(); + callWeakPointerZonesCallbacks(); } void @@ -4057,7 +4057,7 @@ GCRuntime::markWeakReferences(gcstats::Phase phase) void GCRuntime::markWeakReferencesInCurrentGroup(gcstats::Phase phase) { - markWeakReferences(phase); + markWeakReferences(phase); } template @@ -4080,7 +4080,7 @@ GCRuntime::markGrayReferences(gcstats::Phase phase) void GCRuntime::markGrayReferencesInCurrentGroup(gcstats::Phase phase) { - markGrayReferences(phase); + markGrayReferences(phase); } void @@ -4466,7 +4466,7 @@ JSCompartment::findDeadProxyZoneEdges(bool* foundAny) if (IsDeadProxyObject(&value.toObject())) { *foundAny = true; CrossCompartmentKey& key = e.front().mutableKey(); - if (!key.as()->zone()->gcZoneGroupEdges().put(zone())) + if (!key.as()->zone()->gcSweepGroupEdges().put(zone())) return false; } } @@ -4490,7 +4490,7 @@ Zone::findOutgoingEdges(ZoneComponentFinder& finder) for (CompartmentsInZoneIter comp(this); !comp.done(); comp.next()) comp->findOutgoingEdges(finder); - for (ZoneSet::Range r = gcZoneGroupEdges().all(); !r.empty(); r.popFront()) { + for (ZoneSet::Range r = gcSweepGroupEdges().all(); !r.empty(); r.popFront()) { if (r.front()->isGCMarking()) finder.addEdgeTo(r.front()); } @@ -4534,11 +4534,11 @@ GCRuntime::findInterZoneEdges() } void -GCRuntime::findZoneGroups(AutoLockForExclusiveAccess& lock) +GCRuntime::groupZonesForSweeping(AutoLockForExclusiveAccess& lock) { #ifdef DEBUG for (ZonesIter zone(rt, WithAtoms); !zone.done(); zone.next()) - MOZ_ASSERT(zone->gcZoneGroupEdges().empty()); + MOZ_ASSERT(zone->gcSweepGroupEdges().empty()); #endif JSContext* cx = TlsContext.get(); @@ -4550,22 +4550,22 @@ GCRuntime::findZoneGroups(AutoLockForExclusiveAccess& lock) MOZ_ASSERT(zone->isGCMarking()); finder.addNode(zone); } - zoneGroups = finder.getResultsList(); - currentZoneGroup = zoneGroups; - zoneGroupIndex = 0; + sweepGroups = finder.getResultsList(); + currentSweepGroup = sweepGroups; + sweepGroupIndex = 0; for (GCZonesIter zone(rt); !zone.done(); zone.next()) - zone->gcZoneGroupEdges().clear(); + zone->gcSweepGroupEdges().clear(); #ifdef DEBUG - for (Zone* head = currentZoneGroup; head; head = head->nextGroup()) { + for (Zone* head = currentSweepGroup; head; head = head->nextGroup()) { for (Zone* zone = head; zone; zone = zone->nextNodeInGroup()) MOZ_ASSERT(zone->isGCMarking()); } - MOZ_ASSERT_IF(!isIncremental, !currentZoneGroup->nextGroup()); + MOZ_ASSERT_IF(!isIncremental, !currentSweepGroup->nextGroup()); for (ZonesIter zone(rt, WithAtoms); !zone.done(); zone.next()) - MOZ_ASSERT(zone->gcZoneGroupEdges().empty()); + MOZ_ASSERT(zone->gcSweepGroupEdges().empty()); #endif } @@ -4573,26 +4573,26 @@ static void ResetGrayList(JSCompartment* comp); void -GCRuntime::getNextZoneGroup() +GCRuntime::getNextSweepGroup() { - currentZoneGroup = currentZoneGroup->nextGroup(); - ++zoneGroupIndex; - if (!currentZoneGroup) { + currentSweepGroup = currentSweepGroup->nextGroup(); + ++sweepGroupIndex; + if (!currentSweepGroup) { abortSweepAfterCurrentGroup = false; return; } - for (Zone* zone = currentZoneGroup; zone; zone = zone->nextNodeInGroup()) { + for (Zone* zone = currentSweepGroup; zone; zone = zone->nextNodeInGroup()) { MOZ_ASSERT(zone->isGCMarking()); MOZ_ASSERT(!zone->isQueuedForBackgroundSweep()); } if (!isIncremental) - ZoneComponentFinder::mergeGroups(currentZoneGroup); + ZoneComponentFinder::mergeGroups(currentSweepGroup); if (abortSweepAfterCurrentGroup) { MOZ_ASSERT(!isIncremental); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { MOZ_ASSERT(!zone->gcNextGraphComponent); MOZ_ASSERT(zone->isGCMarking()); zone->setNeedsIncrementalBarrier(false, Zone::UpdateJit); @@ -4604,7 +4604,7 @@ GCRuntime::getNextZoneGroup() ResetGrayList(comp); abortSweepAfterCurrentGroup = false; - currentZoneGroup = nullptr; + currentSweepGroup = nullptr; } } @@ -4853,7 +4853,7 @@ js::NotifyGCPostSwap(JSObject* a, JSObject* b, unsigned removedFlags) } void -GCRuntime::endMarkingZoneGroup() +GCRuntime::endMarkingSweepGroup() { gcstats::AutoPhase ap(stats(), gcstats::PHASE_SWEEP_MARK); @@ -4871,7 +4871,7 @@ GCRuntime::endMarkingZoneGroup() * these will be marked through, as they are not marked with * MarkCrossCompartmentXXX. */ - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { MOZ_ASSERT(zone->isGCMarkingBlack()); zone->setGCState(Zone::MarkGray); } @@ -4885,7 +4885,7 @@ GCRuntime::endMarkingZoneGroup() markWeakReferencesInCurrentGroup(gcstats::PHASE_SWEEP_MARK_GRAY_WEAK); /* Restore marking state. */ - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { MOZ_ASSERT(zone->isGCMarkingGray()); zone->setGCState(Zone::Mark); } @@ -5010,7 +5010,7 @@ using WeakCacheTaskVector = mozilla::Vector* cache : zone->weakCaches()) { SweepWeakCacheTask task(rt, *cache); task.runFromActiveCooperatingThread(rt); @@ -5022,7 +5022,7 @@ static WeakCacheTaskVector PrepareWeakCacheTasks(JSRuntime* rt) { WeakCacheTaskVector out; - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { for (JS::WeakCache* cache : zone->weakCaches()) { if (!out.append(SweepWeakCacheTask(rt, *cache))) { SweepWeakCachesFromActiveCooperatingThread(rt); @@ -5034,15 +5034,15 @@ PrepareWeakCacheTasks(JSRuntime* rt) } void -GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) +GCRuntime::beginSweepingSweepGroup(AutoLockForExclusiveAccess& lock) { /* - * Begin sweeping the group of zones in gcCurrentZoneGroup, - * performing actions that must be done before yielding to caller. + * Begin sweeping the group of zones in currentSweepGroup, performing + * actions that must be done before yielding to caller. */ bool sweepingAtoms = false; - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { /* Set the GC state to sweeping. */ MOZ_ASSERT(zone->isGCMarking()); zone->setGCState(Zone::Sweep); @@ -5057,7 +5057,7 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) rt->sweepZoneCallback(zone); #ifdef DEBUG - zone->gcLastZoneGroupIndex = zoneGroupIndex; + zone->gcLastSweepGroupIndex = sweepGroupIndex; #endif } @@ -5071,7 +5071,7 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) SweepMiscTask sweepMiscTask(rt); WeakCacheTaskVector sweepCacheTasks = PrepareWeakCacheTasks(rt); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { /* Clear all weakrefs that point to unmarked things. */ for (auto edge : zone->gcWeakRefs()) { /* Edges may be present multiple times, so may already be nulled. */ @@ -5080,22 +5080,22 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) } zone->gcWeakRefs().clear(); - /* No need to look up any more weakmap keys from this zone group. */ + /* No need to look up any more weakmap keys from this sweep group. */ AutoEnterOOMUnsafeRegion oomUnsafe; if (!zone->gcWeakKeys().clear()) - oomUnsafe.crash("clearing weak keys in beginSweepingZoneGroup()"); + oomUnsafe.crash("clearing weak keys in beginSweepingSweepGroup()"); } { gcstats::AutoPhase ap(stats(), gcstats::PHASE_FINALIZE_START); callFinalizeCallbacks(&fop, JSFINALIZE_GROUP_START); { - gcstats::AutoPhase ap2(stats(), gcstats::PHASE_WEAK_ZONEGROUP_CALLBACK); - callWeakPointerZoneGroupCallbacks(); + gcstats::AutoPhase ap2(stats(), gcstats::PHASE_WEAK_ZONES_CALLBACK); + callWeakPointerZonesCallbacks(); } { gcstats::AutoPhase ap2(stats(), gcstats::PHASE_WEAK_COMPARTMENT_CALLBACK); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next()) callWeakPointerCompartmentCallbacks(comp); } @@ -5109,7 +5109,7 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) { gcstats::AutoPhase ap(stats(), gcstats::PHASE_SWEEP_COMPARTMENTS); - gcstats::AutoSCC scc(stats(), zoneGroupIndex); + gcstats::AutoSCC scc(stats(), sweepGroupIndex); { AutoLockHelperThreadState helperLock; @@ -5136,7 +5136,7 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) c->sweepTemplateObjects(); } - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) zone->sweepWeakMaps(); // Bug 1071218: the following two methods have not yet been @@ -5159,26 +5159,26 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) { gcstats::AutoPhase apdc(stats(), gcstats::PHASE_SWEEP_DISCARD_CODE); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) zone->discardJitCode(&fop); } { gcstats::AutoPhase ap1(stats(), gcstats::PHASE_SWEEP_TYPES); gcstats::AutoPhase ap2(stats(), gcstats::PHASE_SWEEP_TYPES_BEGIN); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) zone->beginSweepTypes(&fop, releaseObservedTypes && !zone->isPreservingCode()); } { gcstats::AutoPhase ap(stats(), gcstats::PHASE_SWEEP_BREAKPOINT); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) zone->sweepBreakpoints(&fop); } { gcstats::AutoPhase ap(stats(), gcstats::PHASE_SWEEP_BREAKPOINT); - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) zone->sweepUniqueIds(&fop); } } @@ -5191,7 +5191,7 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) { gcstats::AutoPhase ap(stats(), gcstats::PHASE_SWEEP_COMPARTMENTS); - gcstats::AutoSCC scc(stats(), zoneGroupIndex); + gcstats::AutoSCC scc(stats(), sweepGroupIndex); AutoLockHelperThreadState helperLock; joinTask(sweepCCWrappersTask, gcstats::PHASE_SWEEP_CC_WRAPPER, helperLock); @@ -5211,29 +5211,29 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) * Objects are finalized immediately but this may change in the future. */ - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { - gcstats::AutoSCC scc(stats(), zoneGroupIndex); + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { + gcstats::AutoSCC scc(stats(), sweepGroupIndex); zone->arenas.queueForegroundObjectsForSweep(&fop); } - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { - gcstats::AutoSCC scc(stats(), zoneGroupIndex); + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { + gcstats::AutoSCC scc(stats(), sweepGroupIndex); for (unsigned i = 0; i < ArrayLength(IncrementalFinalizePhases); ++i) zone->arenas.queueForForegroundSweep(&fop, IncrementalFinalizePhases[i]); } - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { - gcstats::AutoSCC scc(stats(), zoneGroupIndex); + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { + gcstats::AutoSCC scc(stats(), sweepGroupIndex); for (unsigned i = 0; i < ArrayLength(BackgroundFinalizePhases); ++i) zone->arenas.queueForBackgroundSweep(&fop, BackgroundFinalizePhases[i]); } - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { - gcstats::AutoSCC scc(stats(), zoneGroupIndex); + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { + gcstats::AutoSCC scc(stats(), sweepGroupIndex); zone->arenas.queueForegroundThingsForSweep(&fop); } sweepingTypes = true; finalizePhase = 0; - sweepZone = currentZoneGroup; + sweepZone = currentSweepGroup; sweepKind = AllocKind::FIRST; { @@ -5243,10 +5243,10 @@ GCRuntime::beginSweepingZoneGroup(AutoLockForExclusiveAccess& lock) } void -GCRuntime::endSweepingZoneGroup() +GCRuntime::endSweepingSweepGroup() { /* Update the GC state for zones we have swept. */ - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) { + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) { MOZ_ASSERT(zone->isGCSweeping()); AutoLockGC lock(rt); zone->setGCState(Zone::Finished); @@ -5256,7 +5256,7 @@ GCRuntime::endSweepingZoneGroup() /* Start background thread to sweep zones if required. */ ZoneList zones; - for (GCZoneGroupIter zone(rt); !zone.done(); zone.next()) + for (GCSweepGroupIter zone(rt); !zone.done(); zone.next()) zones.append(zone); if (sweepOnBackgroundThread) queueZonesForBackgroundSweep(zones); @@ -5299,9 +5299,9 @@ GCRuntime::beginSweepPhase(bool destroyingRuntime, AutoLockForExclusiveAccess& l AssertNoWrappersInGrayList(rt); DropStringWrappers(rt); - findZoneGroups(lock); - endMarkingZoneGroup(); - beginSweepingZoneGroup(lock); + groupZonesForSweeping(lock); + endMarkingSweepGroup(); + beginSweepingSweepGroup(lock); } bool @@ -5391,10 +5391,10 @@ GCRuntime::sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock // Sweep dead type information stored in scripts and object groups, but // don't finalize them yet. We have to sweep dead information from both // live and dead scripts and object groups, so that no dead references - // remain in them. Type inference can end up crawling these zones - // again, such as for TypeCompartment::markSetsUnknown, and if this - // happens after sweeping for the zone group finishes we won't be able - // to determine which things in the zone are live. + // remain in them. Type inference can end up crawling these zones again, + // such as for TypeCompartment::markSetsUnknown, and if this happens + // after sweeping for the sweep group finishes we won't be able to + // determine which things in the zone are live. if (sweepingTypes) { gcstats::AutoPhase ap1(stats(), gcstats::PHASE_SWEEP_COMPARTMENTS); gcstats::AutoPhase ap2(stats(), gcstats::PHASE_SWEEP_TYPES); @@ -5425,7 +5425,7 @@ GCRuntime::sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock al.mergeForegroundSweptObjectArenas(); } - sweepZone = currentZoneGroup; + sweepZone = currentSweepGroup; sweepingTypes = false; } @@ -5456,7 +5456,7 @@ GCRuntime::sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock } sweepKind = AllocKind::FIRST; } - sweepZone = currentZoneGroup; + sweepZone = currentSweepGroup; } /* Remove dead shapes from the shape tree, but don't finalize them yet. */ @@ -5474,13 +5474,13 @@ GCRuntime::sweepPhase(SliceBudget& sliceBudget, AutoLockForExclusiveAccess& lock } } - endSweepingZoneGroup(); - getNextZoneGroup(); - if (!currentZoneGroup) + endSweepingSweepGroup(); + getNextSweepGroup(); + if (!currentSweepGroup) return Finished; - endMarkingZoneGroup(); - beginSweepingZoneGroup(lock); + endMarkingSweepGroup(); + beginSweepingSweepGroup(lock); } } @@ -5807,7 +5807,7 @@ GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoLockForExclusiveAccess for (CompartmentsIter c(rt, SkipAtoms); !c.done(); c.next()) c->scheduledForDestruction = false; - /* Finish sweeping the current zone group, then abort. */ + /* Finish sweeping the current sweep group, then abort. */ abortSweepAfterCurrentGroup = true; /* Don't perform any compaction after sweeping. */ diff --git a/js/src/jsgcinlines.h b/js/src/jsgcinlines.h index 612c854b734d6..9024985af073e 100644 --- a/js/src/jsgcinlines.h +++ b/js/src/jsgcinlines.h @@ -445,15 +445,15 @@ class GCZonesIter typedef CompartmentsIterT GCCompartmentsIter; -/* Iterates over all zones in the current zone group. */ -class GCZoneGroupIter { +/* Iterates over all zones in the current sweep group. */ +class GCSweepGroupIter { private: JS::Zone* current; public: - explicit GCZoneGroupIter(JSRuntime* rt) { + explicit GCSweepGroupIter(JSRuntime* rt) { MOZ_ASSERT(CurrentThreadIsPerformingGC()); - current = rt->gc.getCurrentZoneGroup(); + current = rt->gc.getCurrentSweepGroup(); } bool done() const { return !current; } @@ -472,7 +472,7 @@ class GCZoneGroupIter { JS::Zone* operator->() const { return get(); } }; -typedef CompartmentsIterT GCCompartmentGroupIter; +typedef CompartmentsIterT GCCompartmentGroupIter; inline void RelocationOverlay::forwardTo(Cell* cell) diff --git a/js/src/jsweakmap.cpp b/js/src/jsweakmap.cpp index 349c0fbb3c42c..9764af9c1a3cf 100644 --- a/js/src/jsweakmap.cpp +++ b/js/src/jsweakmap.cpp @@ -147,7 +147,7 @@ ObjectValueMap::findZoneEdges() Zone* delegateZone = delegate->zone(); if (delegateZone == zone() || !delegateZone->isGCMarking()) continue; - if (!delegateZone->gcZoneGroupEdges().put(key->zone())) + if (!delegateZone->gcSweepGroupEdges().put(key->zone())) return false; } return true; diff --git a/js/src/vm/Runtime.h b/js/src/vm/Runtime.h index 250819b3e26dd..3dc4109817bd6 100644 --- a/js/src/vm/Runtime.h +++ b/js/src/vm/Runtime.h @@ -561,7 +561,7 @@ struct JSRuntime : public js::MallocProvider } private: - // List of non-ephemeron weak containers to sweep during beginSweepingZoneGroup. + // List of non-ephemeron weak containers to sweep during beginSweepingSweepGroup. js::ActiveThreadData>> weakCaches_; public: mozilla::LinkedList>& weakCaches() { return weakCaches_.ref(); } diff --git a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp index 6f72c9db85100..81536d9b57b6e 100644 --- a/js/xpconnect/src/XPCJSContext.cpp +++ b/js/xpconnect/src/XPCJSContext.cpp @@ -888,7 +888,7 @@ XPCJSContext::FinalizeCallback(JSFreeOp* fop, } /* static */ void -XPCJSContext::WeakPointerZoneGroupCallback(JSContext* cx, void* data) +XPCJSContext::WeakPointerZonesCallback(JSContext* cx, void* data) { // Called before each sweeping slice -- after processing any final marking // triggered by barriers -- to clear out any references to things that are @@ -1582,7 +1582,7 @@ XPCJSContext::~XPCJSContext() // callbacks if we aren't careful. Null out the relevant callbacks. js::SetActivityCallback(Context(), nullptr, nullptr); JS_RemoveFinalizeCallback(Context(), FinalizeCallback); - JS_RemoveWeakPointerZoneGroupCallback(Context(), WeakPointerZoneGroupCallback); + JS_RemoveWeakPointerZonesCallback(Context(), WeakPointerZonesCallback); JS_RemoveWeakPointerCompartmentCallback(Context(), WeakPointerCompartmentCallback); // Clear any pending exception. It might be an XPCWrappedJS, and if we try @@ -3502,7 +3502,7 @@ XPCJSContext::Initialize() mPrevDoCycleCollectionCallback = JS::SetDoCycleCollectionCallback(cx, DoCycleCollectionCallback); JS_AddFinalizeCallback(cx, FinalizeCallback, nullptr); - JS_AddWeakPointerZoneGroupCallback(cx, WeakPointerZoneGroupCallback, this); + JS_AddWeakPointerZonesCallback(cx, WeakPointerZonesCallback, this); JS_AddWeakPointerCompartmentCallback(cx, WeakPointerCompartmentCallback, this); JS_SetWrapObjectCallbacks(cx, &WrapObjectCallbacks); js::SetPreserveWrapperCallback(cx, PreserveWrapper); diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index b9145d73495de..9f2dbe04c2088 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -538,7 +538,7 @@ class XPCJSContext final : public mozilla::CycleCollectedJSContext JSFinalizeStatus status, bool isZoneGC, void* data); - static void WeakPointerZoneGroupCallback(JSContext* cx, void* data); + static void WeakPointerZonesCallback(JSContext* cx, void* data); static void WeakPointerCompartmentCallback(JSContext* cx, JSCompartment* comp, void* data); inline void AddVariantRoot(XPCTraceableVariant* variant); From 734feb962f1a22a11383dbe5172b0752b918ec3c Mon Sep 17 00:00:00 2001 From: Ganesh Chaitanya Kale Date: Wed, 22 Mar 2017 20:46:24 +0530 Subject: [PATCH 275/300] Bug 1349502 - Make tabbrowser.xml use AppConstants from the global scope. r=dao --- browser/base/content/tabbrowser.xml | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 48ecdbcccefc8..08a3bdfd0ab4b 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -68,9 +68,6 @@ Components.classes["@mozilla.org/autocomplete/search;1?name=unifiedcomplete"] .getService(Components.interfaces.mozIPlacesAutoComplete); - - (Components.utils.import("resource://gre/modules/AppConstants.jsm", {})).AppConstants; - document.getAnonymousElementByAttribute(this, "anonid", "tabbox"); @@ -108,7 +105,7 @@ new Map(); - this.AppConstants.platform == "macosx"; + AppConstants == "macosx"; @@ -3388,7 +3385,7 @@ Date: Wed, 22 Mar 2017 18:44:10 +0100 Subject: [PATCH 276/300] Bug 1349434 - Fixing the saving in the JSONviewer, r=qdot --- devtools/client/jsonview/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/client/jsonview/main.js b/devtools/client/jsonview/main.js index eb552649717b6..b12fe414225ba 100644 --- a/devtools/client/jsonview/main.js +++ b/devtools/client/jsonview/main.js @@ -50,7 +50,7 @@ var JsonView = { * in the parent process. */ onSave: function (message) { - JsonViewUtils.getTargetFile(file => { + JsonViewUtils.getTargetFile().then(file => { if (file) { JsonViewUtils.saveToFile(file, message.data); } From f71261d4a6d5b9e5e11cbda630a2b80c13399d50 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Wed, 22 Mar 2017 18:45:40 +0100 Subject: [PATCH 277/300] Bug 1349512 - Move OriginAttributes class in separate files, r=qdot --- caps/BasePrincipal.cpp | 270 ------------------------------------ caps/BasePrincipal.h | 172 +---------------------- caps/OriginAttributes.cpp | 283 ++++++++++++++++++++++++++++++++++++++ caps/OriginAttributes.h | 184 +++++++++++++++++++++++++ caps/moz.build | 4 +- 5 files changed, 471 insertions(+), 442 deletions(-) create mode 100644 caps/OriginAttributes.cpp create mode 100644 caps/OriginAttributes.h diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index f2a008208f098..b4873eeb44989 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -12,7 +12,6 @@ #endif #include "nsIAddonPolicyService.h" #include "nsIContentSecurityPolicy.h" -#include "nsIEffectiveTLDService.h" #include "nsIObjectInputStream.h" #include "nsIObjectOutputStream.h" @@ -25,279 +24,10 @@ #include "mozilla/dom/ChromeUtils.h" #include "mozilla/dom/CSPDictionariesBinding.h" -#include "mozilla/dom/quota/QuotaManager.h" #include "mozilla/dom/ToJSValue.h" -#include "mozilla/dom/URLSearchParams.h" namespace mozilla { -using dom::URLParams; - -bool OriginAttributes::sFirstPartyIsolation = false; -bool OriginAttributes::sRestrictedOpenerAccess = false; - -void -OriginAttributes::InitPrefs() -{ - MOZ_ASSERT(NS_IsMainThread()); - static bool sInited = false; - if (!sInited) { - sInited = true; - Preferences::AddBoolVarCache(&sFirstPartyIsolation, - "privacy.firstparty.isolate"); - Preferences::AddBoolVarCache(&sRestrictedOpenerAccess, - "privacy.firstparty.isolate.restrict_opener_access"); - } -} - -void -OriginAttributes::SetFirstPartyDomain(const bool aIsTopLevelDocument, - nsIURI* aURI) -{ - bool isFirstPartyEnabled = IsFirstPartyEnabled(); - - // If the pref is off or this is not a top level load, bail out. - if (!isFirstPartyEnabled || !aIsTopLevelDocument) { - return; - } - - nsCOMPtr tldService = - do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); - MOZ_ASSERT(tldService); - if (!tldService) { - return; - } - - nsAutoCString baseDomain; - nsresult rv = tldService->GetBaseDomain(aURI, 0, baseDomain); - if (NS_FAILED(rv)) { - nsAutoCString scheme; - rv = aURI->GetScheme(scheme); - NS_ENSURE_SUCCESS_VOID(rv); - if (scheme.EqualsLiteral("about")) { - baseDomain.AssignLiteral(ABOUT_URI_FIRST_PARTY_DOMAIN); - } - } - - mFirstPartyDomain = NS_ConvertUTF8toUTF16(baseDomain); -} - -void -OriginAttributes::SetFirstPartyDomain(const bool aIsTopLevelDocument, - const nsACString& aDomain) -{ - bool isFirstPartyEnabled = IsFirstPartyEnabled(); - - // If the pref is off or this is not a top level load, bail out. - if (!isFirstPartyEnabled || !aIsTopLevelDocument) { - return; - } - - mFirstPartyDomain = NS_ConvertUTF8toUTF16(aDomain); -} - -void -OriginAttributes::CreateSuffix(nsACString& aStr) const -{ - URLParams params; - nsAutoString value; - - // - // Important: While serializing any string-valued attributes, perform a - // release-mode assertion to make sure that they don't contain characters that - // will break the quota manager when it uses the serialization for file - // naming. - // - - if (mAppId != nsIScriptSecurityManager::NO_APP_ID) { - value.AppendInt(mAppId); - params.Set(NS_LITERAL_STRING("appId"), value); - } - - if (mInIsolatedMozBrowser) { - params.Set(NS_LITERAL_STRING("inBrowser"), NS_LITERAL_STRING("1")); - } - - if (mUserContextId != nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID) { - value.Truncate(); - value.AppendInt(mUserContextId); - params.Set(NS_LITERAL_STRING("userContextId"), value); - } - - - if (mPrivateBrowsingId) { - value.Truncate(); - value.AppendInt(mPrivateBrowsingId); - params.Set(NS_LITERAL_STRING("privateBrowsingId"), value); - } - - if (!mFirstPartyDomain.IsEmpty()) { - MOZ_RELEASE_ASSERT(mFirstPartyDomain.FindCharInSet(dom::quota::QuotaManager::kReplaceChars) == kNotFound); - params.Set(NS_LITERAL_STRING("firstPartyDomain"), mFirstPartyDomain); - } - - aStr.Truncate(); - - params.Serialize(value); - if (!value.IsEmpty()) { - aStr.AppendLiteral("^"); - aStr.Append(NS_ConvertUTF16toUTF8(value)); - } - -// In debug builds, check the whole string for illegal characters too (just in case). -#ifdef DEBUG - nsAutoCString str; - str.Assign(aStr); - MOZ_ASSERT(str.FindCharInSet(dom::quota::QuotaManager::kReplaceChars) == kNotFound); -#endif -} - -void -OriginAttributes::CreateAnonymizedSuffix(nsACString& aStr) const -{ - OriginAttributes attrs = *this; - - if (!attrs.mFirstPartyDomain.IsEmpty()) { - attrs.mFirstPartyDomain.AssignLiteral("_anonymizedFirstPartyDomain_"); - } - - attrs.CreateSuffix(aStr); -} - -namespace { - -class MOZ_STACK_CLASS PopulateFromSuffixIterator final - : public URLParams::ForEachIterator -{ -public: - explicit PopulateFromSuffixIterator(OriginAttributes* aOriginAttributes) - : mOriginAttributes(aOriginAttributes) - { - MOZ_ASSERT(aOriginAttributes); - // If mPrivateBrowsingId is passed in as >0 and is not present in the suffix, - // then it will remain >0 when it should be 0 according to the suffix. Set to 0 before - // iterating to fix this. - mOriginAttributes->mPrivateBrowsingId = 0; - } - - bool URLParamsIterator(const nsString& aName, - const nsString& aValue) override - { - if (aName.EqualsLiteral("appId")) { - nsresult rv; - int64_t val = aValue.ToInteger64(&rv); - NS_ENSURE_SUCCESS(rv, false); - NS_ENSURE_TRUE(val <= UINT32_MAX, false); - mOriginAttributes->mAppId = static_cast(val); - - return true; - } - - if (aName.EqualsLiteral("inBrowser")) { - if (!aValue.EqualsLiteral("1")) { - return false; - } - - mOriginAttributes->mInIsolatedMozBrowser = true; - return true; - } - - if (aName.EqualsLiteral("addonId")) { - // No longer supported. Silently ignore so that legacy origin strings - // don't cause failures. - return true; - } - - if (aName.EqualsLiteral("userContextId")) { - nsresult rv; - int64_t val = aValue.ToInteger64(&rv); - NS_ENSURE_SUCCESS(rv, false); - NS_ENSURE_TRUE(val <= UINT32_MAX, false); - mOriginAttributes->mUserContextId = static_cast(val); - - return true; - } - - if (aName.EqualsLiteral("privateBrowsingId")) { - nsresult rv; - int64_t val = aValue.ToInteger64(&rv); - NS_ENSURE_SUCCESS(rv, false); - NS_ENSURE_TRUE(val >= 0 && val <= UINT32_MAX, false); - mOriginAttributes->mPrivateBrowsingId = static_cast(val); - - return true; - } - - if (aName.EqualsLiteral("firstPartyDomain")) { - MOZ_RELEASE_ASSERT(mOriginAttributes->mFirstPartyDomain.IsEmpty()); - mOriginAttributes->mFirstPartyDomain.Assign(aValue); - return true; - } - - // No other attributes are supported. - return false; - } - -private: - OriginAttributes* mOriginAttributes; -}; - -} // namespace - -bool -OriginAttributes::PopulateFromSuffix(const nsACString& aStr) -{ - if (aStr.IsEmpty()) { - return true; - } - - if (aStr[0] != '^') { - return false; - } - - URLParams params; - params.ParseInput(Substring(aStr, 1, aStr.Length() - 1)); - - PopulateFromSuffixIterator iterator(this); - return params.ForEach(iterator); -} - -bool -OriginAttributes::PopulateFromOrigin(const nsACString& aOrigin, - nsACString& aOriginNoSuffix) -{ - // RFindChar is only available on nsCString. - nsCString origin(aOrigin); - int32_t pos = origin.RFindChar('^'); - - if (pos == kNotFound) { - aOriginNoSuffix = origin; - return true; - } - - aOriginNoSuffix = Substring(origin, 0, pos); - return PopulateFromSuffix(Substring(origin, pos)); -} - -void -OriginAttributes::SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing) -{ - mPrivateBrowsingId = aInPrivateBrowsing ? 1 : 0; -} - -/* static */ -bool -OriginAttributes::IsPrivateBrowsing(const nsACString& aOrigin) -{ - nsAutoCString dummy; - OriginAttributes attrs; - if (NS_WARN_IF(!attrs.PopulateFromOrigin(aOrigin, dummy))) { - return false; - } - - return !!attrs.mPrivateBrowsingId; -} - BasePrincipal::BasePrincipal(PrincipalKind aKind) : mKind(aKind) , mDomainSet(false) diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 877060779f7a8..054f3764fcbc3 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -10,9 +10,7 @@ #include "nsJSPrincipals.h" #include "mozilla/Attributes.h" -#include "mozilla/dom/ChromeUtils.h" -#include "mozilla/dom/ChromeUtilsBinding.h" -#include "nsIScriptSecurityManager.h" +#include "mozilla/OriginAttributes.h" class nsIContentSecurityPolicy; class nsIObjectOutputStream; @@ -23,174 +21,6 @@ class ExpandedPrincipal; namespace mozilla { -// Base OriginAttributes class. This has several subclass flavors, and is not -// directly constructable itself. -class OriginAttributes : public dom::OriginAttributesDictionary -{ -public: - OriginAttributes() {} - - OriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser) - { - mAppId = aAppId; - mInIsolatedMozBrowser = aInIsolatedMozBrowser; - } - - explicit OriginAttributes(const OriginAttributesDictionary& aOther) - : OriginAttributesDictionary(aOther) - {} - - void SetFirstPartyDomain(const bool aIsTopLevelDocument, nsIURI* aURI); - void SetFirstPartyDomain(const bool aIsTopLevelDocument, const nsACString& aDomain); - - enum { - STRIP_FIRST_PARTY_DOMAIN = 0x01, - STRIP_USER_CONTEXT_ID = 0x02, - }; - - inline void StripAttributes(uint32_t aFlags) - { - if (aFlags & STRIP_FIRST_PARTY_DOMAIN) { - mFirstPartyDomain.Truncate(); - } - - if (aFlags & STRIP_USER_CONTEXT_ID) { - mUserContextId = nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID; - } - } - - bool operator==(const OriginAttributes& aOther) const - { - return mAppId == aOther.mAppId && - mInIsolatedMozBrowser == aOther.mInIsolatedMozBrowser && - mUserContextId == aOther.mUserContextId && - mPrivateBrowsingId == aOther.mPrivateBrowsingId && - mFirstPartyDomain == aOther.mFirstPartyDomain; - } - - bool operator!=(const OriginAttributes& aOther) const - { - return !(*this == aOther); - } - - // Serializes/Deserializes non-default values into the suffix format, i.e. - // |!key1=value1&key2=value2|. If there are no non-default attributes, this - // returns an empty string. - void CreateSuffix(nsACString& aStr) const; - - // Don't use this method for anything else than debugging! - void CreateAnonymizedSuffix(nsACString& aStr) const; - - MOZ_MUST_USE bool PopulateFromSuffix(const nsACString& aStr); - - // Populates the attributes from a string like - // |uri!key1=value1&key2=value2| and returns the uri without the suffix. - MOZ_MUST_USE bool PopulateFromOrigin(const nsACString& aOrigin, - nsACString& aOriginNoSuffix); - - // Helper function to match mIsPrivateBrowsing to existing private browsing - // flags. Once all other flags are removed, this can be removed too. - void SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing); - - // check if "privacy.firstparty.isolate" is enabled. - static inline bool IsFirstPartyEnabled() - { - return sFirstPartyIsolation; - } - - // check if the access of window.opener across different FPDs is restricted. - // We only restrict the access of window.opener when first party isolation - // is enabled and "privacy.firstparty.isolate.restrict_opener_access" is on. - static inline bool IsRestrictOpenerAccessForFPI() - { - // We always want to restrict window.opener if first party isolation is - // disabled. - return !sFirstPartyIsolation || sRestrictedOpenerAccess; - } - - // returns true if the originAttributes suffix has mPrivateBrowsingId value - // different than 0. - static bool IsPrivateBrowsing(const nsACString& aOrigin); - - static void InitPrefs(); - -private: - static bool sFirstPartyIsolation; - static bool sRestrictedOpenerAccess; -}; - -class OriginAttributesPattern : public dom::OriginAttributesPatternDictionary -{ -public: - // To convert a JSON string to an OriginAttributesPattern, do the following: - // - // OriginAttributesPattern pattern; - // if (!pattern.Init(aJSONString)) { - // ... // handle failure. - // } - OriginAttributesPattern() {} - - explicit OriginAttributesPattern(const OriginAttributesPatternDictionary& aOther) - : OriginAttributesPatternDictionary(aOther) {} - - // Performs a match of |aAttrs| against this pattern. - bool Matches(const OriginAttributes& aAttrs) const - { - if (mAppId.WasPassed() && mAppId.Value() != aAttrs.mAppId) { - return false; - } - - if (mInIsolatedMozBrowser.WasPassed() && mInIsolatedMozBrowser.Value() != aAttrs.mInIsolatedMozBrowser) { - return false; - } - - if (mUserContextId.WasPassed() && mUserContextId.Value() != aAttrs.mUserContextId) { - return false; - } - - if (mPrivateBrowsingId.WasPassed() && mPrivateBrowsingId.Value() != aAttrs.mPrivateBrowsingId) { - return false; - } - - if (mFirstPartyDomain.WasPassed() && mFirstPartyDomain.Value() != aAttrs.mFirstPartyDomain) { - return false; - } - - return true; - } - - bool Overlaps(const OriginAttributesPattern& aOther) const - { - if (mAppId.WasPassed() && aOther.mAppId.WasPassed() && - mAppId.Value() != aOther.mAppId.Value()) { - return false; - } - - if (mInIsolatedMozBrowser.WasPassed() && - aOther.mInIsolatedMozBrowser.WasPassed() && - mInIsolatedMozBrowser.Value() != aOther.mInIsolatedMozBrowser.Value()) { - return false; - } - - if (mUserContextId.WasPassed() && aOther.mUserContextId.WasPassed() && - mUserContextId.Value() != aOther.mUserContextId.Value()) { - return false; - } - - if (mPrivateBrowsingId.WasPassed() && aOther.mPrivateBrowsingId.WasPassed() && - mPrivateBrowsingId.Value() != aOther.mPrivateBrowsingId.Value()) { - return false; - } - - if (mFirstPartyDomain.WasPassed() && aOther.mFirstPartyDomain.WasPassed() && - mFirstPartyDomain.Value() != aOther.mFirstPartyDomain.Value()) { - return false; - } - - return true; - } -}; - /* * Base class from which all nsIPrincipal implementations inherit. Use this for * default implementations and other commonalities between principal diff --git a/caps/OriginAttributes.cpp b/caps/OriginAttributes.cpp new file mode 100644 index 0000000000000..9ee38822e33a0 --- /dev/null +++ b/caps/OriginAttributes.cpp @@ -0,0 +1,283 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 sw=2 et tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/OriginAttributes.h" +#include "mozilla/Preferences.h" +#include "mozilla/dom/URLSearchParams.h" +#include "mozilla/dom/quota/QuotaManager.h" +#include "nsIEffectiveTLDService.h" +#include "nsIURI.h" + +namespace mozilla { + +using dom::URLParams; + +bool OriginAttributes::sFirstPartyIsolation = false; +bool OriginAttributes::sRestrictedOpenerAccess = false; + +void +OriginAttributes::InitPrefs() +{ + MOZ_ASSERT(NS_IsMainThread()); + static bool sInited = false; + if (!sInited) { + sInited = true; + Preferences::AddBoolVarCache(&sFirstPartyIsolation, + "privacy.firstparty.isolate"); + Preferences::AddBoolVarCache(&sRestrictedOpenerAccess, + "privacy.firstparty.isolate.restrict_opener_access"); + } +} + +void +OriginAttributes::SetFirstPartyDomain(const bool aIsTopLevelDocument, + nsIURI* aURI) +{ + bool isFirstPartyEnabled = IsFirstPartyEnabled(); + + // If the pref is off or this is not a top level load, bail out. + if (!isFirstPartyEnabled || !aIsTopLevelDocument) { + return; + } + + nsCOMPtr tldService = + do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); + MOZ_ASSERT(tldService); + if (!tldService) { + return; + } + + nsAutoCString baseDomain; + nsresult rv = tldService->GetBaseDomain(aURI, 0, baseDomain); + if (NS_FAILED(rv)) { + nsAutoCString scheme; + rv = aURI->GetScheme(scheme); + NS_ENSURE_SUCCESS_VOID(rv); + if (scheme.EqualsLiteral("about")) { + baseDomain.AssignLiteral(ABOUT_URI_FIRST_PARTY_DOMAIN); + } + } + + mFirstPartyDomain = NS_ConvertUTF8toUTF16(baseDomain); +} + +void +OriginAttributes::SetFirstPartyDomain(const bool aIsTopLevelDocument, + const nsACString& aDomain) +{ + bool isFirstPartyEnabled = IsFirstPartyEnabled(); + + // If the pref is off or this is not a top level load, bail out. + if (!isFirstPartyEnabled || !aIsTopLevelDocument) { + return; + } + + mFirstPartyDomain = NS_ConvertUTF8toUTF16(aDomain); +} + +void +OriginAttributes::CreateSuffix(nsACString& aStr) const +{ + URLParams params; + nsAutoString value; + + // + // Important: While serializing any string-valued attributes, perform a + // release-mode assertion to make sure that they don't contain characters that + // will break the quota manager when it uses the serialization for file + // naming. + // + + if (mAppId != nsIScriptSecurityManager::NO_APP_ID) { + value.AppendInt(mAppId); + params.Set(NS_LITERAL_STRING("appId"), value); + } + + if (mInIsolatedMozBrowser) { + params.Set(NS_LITERAL_STRING("inBrowser"), NS_LITERAL_STRING("1")); + } + + if (mUserContextId != nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID) { + value.Truncate(); + value.AppendInt(mUserContextId); + params.Set(NS_LITERAL_STRING("userContextId"), value); + } + + + if (mPrivateBrowsingId) { + value.Truncate(); + value.AppendInt(mPrivateBrowsingId); + params.Set(NS_LITERAL_STRING("privateBrowsingId"), value); + } + + if (!mFirstPartyDomain.IsEmpty()) { + MOZ_RELEASE_ASSERT(mFirstPartyDomain.FindCharInSet(dom::quota::QuotaManager::kReplaceChars) == kNotFound); + params.Set(NS_LITERAL_STRING("firstPartyDomain"), mFirstPartyDomain); + } + + aStr.Truncate(); + + params.Serialize(value); + if (!value.IsEmpty()) { + aStr.AppendLiteral("^"); + aStr.Append(NS_ConvertUTF16toUTF8(value)); + } + +// In debug builds, check the whole string for illegal characters too (just in case). +#ifdef DEBUG + nsAutoCString str; + str.Assign(aStr); + MOZ_ASSERT(str.FindCharInSet(dom::quota::QuotaManager::kReplaceChars) == kNotFound); +#endif +} + +void +OriginAttributes::CreateAnonymizedSuffix(nsACString& aStr) const +{ + OriginAttributes attrs = *this; + + if (!attrs.mFirstPartyDomain.IsEmpty()) { + attrs.mFirstPartyDomain.AssignLiteral("_anonymizedFirstPartyDomain_"); + } + + attrs.CreateSuffix(aStr); +} + +namespace { + +class MOZ_STACK_CLASS PopulateFromSuffixIterator final + : public URLParams::ForEachIterator +{ +public: + explicit PopulateFromSuffixIterator(OriginAttributes* aOriginAttributes) + : mOriginAttributes(aOriginAttributes) + { + MOZ_ASSERT(aOriginAttributes); + // If mPrivateBrowsingId is passed in as >0 and is not present in the suffix, + // then it will remain >0 when it should be 0 according to the suffix. Set to 0 before + // iterating to fix this. + mOriginAttributes->mPrivateBrowsingId = 0; + } + + bool URLParamsIterator(const nsString& aName, + const nsString& aValue) override + { + if (aName.EqualsLiteral("appId")) { + nsresult rv; + int64_t val = aValue.ToInteger64(&rv); + NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_TRUE(val <= UINT32_MAX, false); + mOriginAttributes->mAppId = static_cast(val); + + return true; + } + + if (aName.EqualsLiteral("inBrowser")) { + if (!aValue.EqualsLiteral("1")) { + return false; + } + + mOriginAttributes->mInIsolatedMozBrowser = true; + return true; + } + + if (aName.EqualsLiteral("addonId")) { + // No longer supported. Silently ignore so that legacy origin strings + // don't cause failures. + return true; + } + + if (aName.EqualsLiteral("userContextId")) { + nsresult rv; + int64_t val = aValue.ToInteger64(&rv); + NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_TRUE(val <= UINT32_MAX, false); + mOriginAttributes->mUserContextId = static_cast(val); + + return true; + } + + if (aName.EqualsLiteral("privateBrowsingId")) { + nsresult rv; + int64_t val = aValue.ToInteger64(&rv); + NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_TRUE(val >= 0 && val <= UINT32_MAX, false); + mOriginAttributes->mPrivateBrowsingId = static_cast(val); + + return true; + } + + if (aName.EqualsLiteral("firstPartyDomain")) { + MOZ_RELEASE_ASSERT(mOriginAttributes->mFirstPartyDomain.IsEmpty()); + mOriginAttributes->mFirstPartyDomain.Assign(aValue); + return true; + } + + // No other attributes are supported. + return false; + } + +private: + OriginAttributes* mOriginAttributes; +}; + +} // namespace + +bool +OriginAttributes::PopulateFromSuffix(const nsACString& aStr) +{ + if (aStr.IsEmpty()) { + return true; + } + + if (aStr[0] != '^') { + return false; + } + + URLParams params; + params.ParseInput(Substring(aStr, 1, aStr.Length() - 1)); + + PopulateFromSuffixIterator iterator(this); + return params.ForEach(iterator); +} + +bool +OriginAttributes::PopulateFromOrigin(const nsACString& aOrigin, + nsACString& aOriginNoSuffix) +{ + // RFindChar is only available on nsCString. + nsCString origin(aOrigin); + int32_t pos = origin.RFindChar('^'); + + if (pos == kNotFound) { + aOriginNoSuffix = origin; + return true; + } + + aOriginNoSuffix = Substring(origin, 0, pos); + return PopulateFromSuffix(Substring(origin, pos)); +} + +void +OriginAttributes::SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing) +{ + mPrivateBrowsingId = aInPrivateBrowsing ? 1 : 0; +} + +/* static */ +bool +OriginAttributes::IsPrivateBrowsing(const nsACString& aOrigin) +{ + nsAutoCString dummy; + OriginAttributes attrs; + if (NS_WARN_IF(!attrs.PopulateFromOrigin(aOrigin, dummy))) { + return false; + } + + return !!attrs.mPrivateBrowsingId; +} + +} // namespace mozilla diff --git a/caps/OriginAttributes.h b/caps/OriginAttributes.h new file mode 100644 index 0000000000000..b0ca8bf2fa190 --- /dev/null +++ b/caps/OriginAttributes.h @@ -0,0 +1,184 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_OriginAttributes_h +#define mozilla_OriginAttributes_h + +#include "mozilla/dom/ChromeUtils.h" +#include "mozilla/dom/ChromeUtilsBinding.h" +#include "nsIScriptSecurityManager.h" + +namespace mozilla { + +class OriginAttributes : public dom::OriginAttributesDictionary +{ +public: + OriginAttributes() {} + + OriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser) + { + mAppId = aAppId; + mInIsolatedMozBrowser = aInIsolatedMozBrowser; + } + + explicit OriginAttributes(const OriginAttributesDictionary& aOther) + : OriginAttributesDictionary(aOther) + {} + + void SetFirstPartyDomain(const bool aIsTopLevelDocument, nsIURI* aURI); + void SetFirstPartyDomain(const bool aIsTopLevelDocument, const nsACString& aDomain); + + enum { + STRIP_FIRST_PARTY_DOMAIN = 0x01, + STRIP_USER_CONTEXT_ID = 0x02, + }; + + inline void StripAttributes(uint32_t aFlags) + { + if (aFlags & STRIP_FIRST_PARTY_DOMAIN) { + mFirstPartyDomain.Truncate(); + } + + if (aFlags & STRIP_USER_CONTEXT_ID) { + mUserContextId = nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID; + } + } + + bool operator==(const OriginAttributes& aOther) const + { + return mAppId == aOther.mAppId && + mInIsolatedMozBrowser == aOther.mInIsolatedMozBrowser && + mUserContextId == aOther.mUserContextId && + mPrivateBrowsingId == aOther.mPrivateBrowsingId && + mFirstPartyDomain == aOther.mFirstPartyDomain; + } + + bool operator!=(const OriginAttributes& aOther) const + { + return !(*this == aOther); + } + + // Serializes/Deserializes non-default values into the suffix format, i.e. + // |!key1=value1&key2=value2|. If there are no non-default attributes, this + // returns an empty string. + void CreateSuffix(nsACString& aStr) const; + + // Don't use this method for anything else than debugging! + void CreateAnonymizedSuffix(nsACString& aStr) const; + + MOZ_MUST_USE bool PopulateFromSuffix(const nsACString& aStr); + + // Populates the attributes from a string like + // |uri!key1=value1&key2=value2| and returns the uri without the suffix. + MOZ_MUST_USE bool PopulateFromOrigin(const nsACString& aOrigin, + nsACString& aOriginNoSuffix); + + // Helper function to match mIsPrivateBrowsing to existing private browsing + // flags. Once all other flags are removed, this can be removed too. + void SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing); + + // check if "privacy.firstparty.isolate" is enabled. + static inline bool IsFirstPartyEnabled() + { + return sFirstPartyIsolation; + } + + // check if the access of window.opener across different FPDs is restricted. + // We only restrict the access of window.opener when first party isolation + // is enabled and "privacy.firstparty.isolate.restrict_opener_access" is on. + static inline bool IsRestrictOpenerAccessForFPI() + { + // We always want to restrict window.opener if first party isolation is + // disabled. + return !sFirstPartyIsolation || sRestrictedOpenerAccess; + } + + // returns true if the originAttributes suffix has mPrivateBrowsingId value + // different than 0. + static bool IsPrivateBrowsing(const nsACString& aOrigin); + + static void InitPrefs(); + +private: + static bool sFirstPartyIsolation; + static bool sRestrictedOpenerAccess; +}; + +class OriginAttributesPattern : public dom::OriginAttributesPatternDictionary +{ +public: + // To convert a JSON string to an OriginAttributesPattern, do the following: + // + // OriginAttributesPattern pattern; + // if (!pattern.Init(aJSONString)) { + // ... // handle failure. + // } + OriginAttributesPattern() {} + + explicit OriginAttributesPattern(const OriginAttributesPatternDictionary& aOther) + : OriginAttributesPatternDictionary(aOther) {} + + // Performs a match of |aAttrs| against this pattern. + bool Matches(const OriginAttributes& aAttrs) const + { + if (mAppId.WasPassed() && mAppId.Value() != aAttrs.mAppId) { + return false; + } + + if (mInIsolatedMozBrowser.WasPassed() && mInIsolatedMozBrowser.Value() != aAttrs.mInIsolatedMozBrowser) { + return false; + } + + if (mUserContextId.WasPassed() && mUserContextId.Value() != aAttrs.mUserContextId) { + return false; + } + + if (mPrivateBrowsingId.WasPassed() && mPrivateBrowsingId.Value() != aAttrs.mPrivateBrowsingId) { + return false; + } + + if (mFirstPartyDomain.WasPassed() && mFirstPartyDomain.Value() != aAttrs.mFirstPartyDomain) { + return false; + } + + return true; + } + + bool Overlaps(const OriginAttributesPattern& aOther) const + { + if (mAppId.WasPassed() && aOther.mAppId.WasPassed() && + mAppId.Value() != aOther.mAppId.Value()) { + return false; + } + + if (mInIsolatedMozBrowser.WasPassed() && + aOther.mInIsolatedMozBrowser.WasPassed() && + mInIsolatedMozBrowser.Value() != aOther.mInIsolatedMozBrowser.Value()) { + return false; + } + + if (mUserContextId.WasPassed() && aOther.mUserContextId.WasPassed() && + mUserContextId.Value() != aOther.mUserContextId.Value()) { + return false; + } + + if (mPrivateBrowsingId.WasPassed() && aOther.mPrivateBrowsingId.WasPassed() && + mPrivateBrowsingId.Value() != aOther.mPrivateBrowsingId.Value()) { + return false; + } + + if (mFirstPartyDomain.WasPassed() && aOther.mFirstPartyDomain.WasPassed() && + mFirstPartyDomain.Value() != aOther.mFirstPartyDomain.Value()) { + return false; + } + + return true; + } +}; + +} // namespace mozilla + +#endif /* mozilla_OriginAttributes_h */ diff --git a/caps/moz.build b/caps/moz.build index 2f3d6614cdf58..46331e93f0976 100644 --- a/caps/moz.build +++ b/caps/moz.build @@ -30,7 +30,8 @@ EXPORTS += [ ] EXPORTS.mozilla = [ - 'BasePrincipal.h' + 'BasePrincipal.h', + 'OriginAttributes.h', ] SOURCES += [ @@ -47,6 +48,7 @@ UNIFIED_SOURCES += [ 'nsScriptSecurityManager.cpp', 'NullPrincipal.cpp', 'NullPrincipalURI.cpp', + 'OriginAttributes.cpp', 'SystemPrincipal.cpp', ] From e4aec6d808b51587193c8789f3dcc6e1cdc30b57 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Sat, 18 Mar 2017 16:08:12 -0400 Subject: [PATCH 278/300] Bug 1316683 - Avoid going into SpiderMonkey for retrieving origin attributes; r=baku Our caller is C++ code, and the implementations are all also written in C++, so there is no reason to go through SpiderMonkey here. This patch also makes nsILoadContext builtinclass to ensure that the implementation is always native. --- caps/nsScriptSecurityManager.cpp | 3 +- docshell/base/LoadContext.cpp | 30 ++++--------------- docshell/base/LoadContext.h | 2 ++ docshell/base/SerializedLoadContext.cpp | 4 +-- docshell/base/nsDocShell.cpp | 6 ++++ docshell/base/nsDocShell.h | 2 ++ docshell/base/nsILoadContext.idl | 6 ++-- dom/base/nsDocument.h | 20 +++++++++---- dom/ipc/TabParent.cpp | 1 + dom/offline/nsDOMOfflineResourceList.cpp | 3 +- .../prefetch/OfflineCacheUpdateParent.cpp | 8 +++++ uriloader/prefetch/OfflineCacheUpdateParent.h | 2 ++ 12 files changed, 46 insertions(+), 41 deletions(-) diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 0d587f8115a3c..7d70c97a8f1e6 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -1168,8 +1168,7 @@ nsScriptSecurityManager:: { NS_ENSURE_STATE(aLoadContext); OriginAttributes docShellAttrs; - bool result = aLoadContext->GetOriginAttributes(docShellAttrs); - NS_ENSURE_TRUE(result, NS_ERROR_FAILURE); + aLoadContext->GetOriginAttributes(docShellAttrs); nsCOMPtr prin = BasePrincipal::CreateCodebasePrincipal(aURI, docShellAttrs); diff --git a/docshell/base/LoadContext.cpp b/docshell/base/LoadContext.cpp index 6c3ba6b523119..03fa532731890 100644 --- a/docshell/base/LoadContext.cpp +++ b/docshell/base/LoadContext.cpp @@ -12,30 +12,6 @@ #include "nsContentUtils.h" #include "xpcpublic.h" -bool -nsILoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - mozilla::dom::AutoJSAPI jsapi; - bool ok = jsapi.Init(xpc::PrivilegedJunkScope()); - NS_ENSURE_TRUE(ok, false); - JS::Rooted v(jsapi.cx()); - nsresult rv = GetOriginAttributes(&v); - NS_ENSURE_SUCCESS(rv, false); - NS_ENSURE_TRUE(v.isObject(), false); - JS::Rooted obj(jsapi.cx(), &v.toObject()); - - // If we're JS-implemented, the object will be left in a different (System-Principaled) - // scope, so we may need to enter its compartment. - MOZ_ASSERT(nsContentUtils::IsSystemPrincipal(nsContentUtils::ObjectPrincipal(obj))); - JSAutoCompartment ac(jsapi.cx(), obj); - - mozilla::OriginAttributes attrs; - ok = attrs.Init(jsapi.cx(), v); - NS_ENSURE_TRUE(ok, false); - aAttrs = attrs; - return true; -} - namespace mozilla { NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor) @@ -181,6 +157,12 @@ LoadContext::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } +NS_IMETHODIMP_(void) +LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + aAttrs = mOriginAttributes; +} + NS_IMETHODIMP LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/docshell/base/LoadContext.h b/docshell/base/LoadContext.h index 0b05899ab9346..dc0012c76d3c8 100644 --- a/docshell/base/LoadContext.h +++ b/docshell/base/LoadContext.h @@ -111,6 +111,8 @@ class LoadContext final private: ~LoadContext() {} + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; + nsWeakPtr mTopFrameElement; uint64_t mNestedFrameId; bool mIsContent; diff --git a/docshell/base/SerializedLoadContext.cpp b/docshell/base/SerializedLoadContext.cpp index 501a417a5125a..3964a78f9fc3e 100644 --- a/docshell/base/SerializedLoadContext.cpp +++ b/docshell/base/SerializedLoadContext.cpp @@ -62,9 +62,7 @@ SerializedLoadContext::Init(nsILoadContext* aLoadContext) aLoadContext->GetIsContent(&mIsContent); aLoadContext->GetUseRemoteTabs(&mUseRemoteTabs); aLoadContext->GetUseTrackingProtection(&mUseTrackingProtection); - if (!aLoadContext->GetOriginAttributes(mOriginAttributes)) { - NS_WARNING("GetOriginAttributes failed"); - } + aLoadContext->GetOriginAttributes(mOriginAttributes); } else { mIsNotNull = false; mIsPrivateBitValid = false; diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index 6ed2909fb70e1..d07474e493c3d 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -14944,3 +14944,9 @@ nsDocShell::GetAwaitingLargeAlloc(bool* aResult) *aResult = static_cast(tabChild.get())->IsAwaitingLargeAlloc(); return NS_OK; } + +NS_IMETHODIMP_(void) +nsDocShell::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + aAttrs = mOriginAttributes; +} diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index 9378970233404..af5416c105c98 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -806,6 +806,8 @@ class nsDocShell final void UpdateGlobalHistoryTitle(nsIURI* aURI); + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; + // Dimensions of the docshell nsIntRect mBounds; nsString mName; diff --git a/docshell/base/nsILoadContext.idl b/docshell/base/nsILoadContext.idl index 98e8a21191714..d3a39a676c79b 100644 --- a/docshell/base/nsILoadContext.idl +++ b/docshell/base/nsILoadContext.idl @@ -20,7 +20,7 @@ interface nsIDOMElement; * can be queried for various information about where the load is * happening. */ -[scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] +[builtinclass, scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] interface nsILoadContext : nsISupports { /** @@ -139,10 +139,8 @@ interface nsILoadContext : nsISupports #ifdef MOZILLA_INTERNAL_API /** * The C++ getter for origin attributes. - * - * Defined in LoadContext.cpp */ - bool GetOriginAttributes(mozilla::OriginAttributes& aAttrs); + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) = 0; #endif %} }; diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h index 9ef1d404de77f..05d0cb772e88a 100644 --- a/dom/base/nsDocument.h +++ b/dom/base/nsDocument.h @@ -444,7 +444,7 @@ class nsExternalResourceMap // implement one interface. // XXXbz I wish we could just derive the _allcaps thing from _i -#define DECL_SHIM(_i, _allcaps) \ +#define DECL_SHIM(_i, _allcaps, _customfwd) \ class _i##Shim final : public nsIInterfaceRequestor, \ public _i \ { \ @@ -459,17 +459,25 @@ class nsExternalResourceMap NS_DECL_ISUPPORTS \ NS_FORWARD_NSIINTERFACEREQUESTOR(mIfReq->) \ NS_FORWARD_##_allcaps(mRealPtr->) \ + _customfwd \ private: \ nsCOMPtr mIfReq; \ nsCOMPtr<_i> mRealPtr; \ }; - DECL_SHIM(nsILoadContext, NSILOADCONTEXT) - DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK) - DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK) - DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK) - DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER) +#define DECL_FORWARD_CPP_GETORIGINATTRIBUTES \ + NS_IMETHODIMP_(void) \ + GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override \ + { \ + mRealPtr->GetOriginAttributes(aAttrs); \ + } + DECL_SHIM(nsILoadContext, NSILOADCONTEXT, DECL_FORWARD_CPP_GETORIGINATTRIBUTES) + DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK, ) + DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK, ) + DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK, ) + DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER, ) #undef DECL_SHIM +#undef DECL_FORWARD_CPP_GETORIGINATTRIBUTES }; /** diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index 87163e1bcb91c..e6e144df1a892 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -3020,6 +3020,7 @@ class FakeChannel final : public nsIChannel, NS_IMETHOD SetPrivateBrowsing(bool) NO_IMPL NS_IMETHOD GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL NS_IMETHOD GetOriginAttributes(JS::MutableHandleValue) NO_IMPL + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override {} NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL NS_IMETHOD SetRemoteTabs(bool) NO_IMPL NS_IMETHOD GetUseTrackingProtection(bool*) NO_IMPL diff --git a/dom/offline/nsDOMOfflineResourceList.cpp b/dom/offline/nsDOMOfflineResourceList.cpp index a02b2956245e5..b6b49670b8b76 100644 --- a/dom/offline/nsDOMOfflineResourceList.cpp +++ b/dom/offline/nsDOMOfflineResourceList.cpp @@ -815,8 +815,7 @@ nsDOMOfflineResourceList::CacheKeys() nsAutoCString originSuffix; if (loadContext) { mozilla::OriginAttributes oa; - bool ok = loadContext->GetOriginAttributes(oa); - NS_ENSURE_TRUE(ok, NS_ERROR_UNEXPECTED); + loadContext->GetOriginAttributes(oa); oa.CreateSuffix(originSuffix); } diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.cpp b/uriloader/prefetch/OfflineCacheUpdateParent.cpp index c77f2b49a02ee..f10821292b715 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.cpp +++ b/uriloader/prefetch/OfflineCacheUpdateParent.cpp @@ -276,6 +276,14 @@ OfflineCacheUpdateParent::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } +NS_IMETHODIMP_(void) +OfflineCacheUpdateParent::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + if (mLoadingPrincipal) { + aAttrs = mLoadingPrincipal->OriginAttributesRef(); + } +} + NS_IMETHODIMP OfflineCacheUpdateParent::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.h b/uriloader/prefetch/OfflineCacheUpdateParent.h index f6dbc1cb2a6f9..2637c6bdca42c 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.h +++ b/uriloader/prefetch/OfflineCacheUpdateParent.h @@ -54,6 +54,8 @@ class OfflineCacheUpdateParent : public POfflineCacheUpdateParent private: ~OfflineCacheUpdateParent(); + NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; + bool mIPCClosed; nsCOMPtr mLoadingPrincipal; From c84f34f08c644a84430adab53c32df6d319fdf29 Mon Sep 17 00:00:00 2001 From: Robert Strong Date: Wed, 22 Mar 2017 11:45:11 -0700 Subject: [PATCH 279/300] Bug 1348609 - Use the installation dir path CityHash hash for the updates directory even when the hash hasn't been written to the registry by the installer. r=mhowell, r=dtownsend --- toolkit/xre/moz.build | 1 + toolkit/xre/nsXREDirProvider.cpp | 25 ++++++++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build index b119d38ab76f7..f79080b35aaaa 100644 --- a/toolkit/xre/moz.build +++ b/toolkit/xre/moz.build @@ -37,6 +37,7 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': ] DEFINES['PROXY_PRINTING'] = 1 LOCAL_INCLUDES += [ + '../../other-licenses/nsis/Contrib/CityHash/cityhash', '../components/printingui/win', ] elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa': diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp index 2c9a41b0feb68..4878923c6f1da 100644 --- a/toolkit/xre/nsXREDirProvider.cpp +++ b/toolkit/xre/nsXREDirProvider.cpp @@ -46,6 +46,7 @@ #include #ifdef XP_WIN +#include "city.h" #include #include #endif @@ -1439,12 +1440,26 @@ nsXREDirProvider::GetUpdateRootDir(nsIFile* *aResult) } } - // Get the local app data directory and if a vendor name exists append it. - // If only a product name exists, append it. If neither exist fallback to - // old handling. We don't use the product name on purpose because we want a - // shared update directory for different apps run from the same path. + if (!pathHashResult) { + // This should only happen when the installer isn't used (e.g. zip builds). + uint64_t hash = CityHash64(static_cast(appDirPath.get()), + appDirPath.Length() * sizeof(nsAutoString::char_type)); + pathHash.AppendInt((int)(hash >> 32), 16); + pathHash.AppendInt((int)hash, 16); + // The installer implementation writes the registry values that were checked + // in the previous block for this value in uppercase and since it is an + // option to have a case sensitive file system on Windows this value must + // also be in uppercase. + ToUpperCase(pathHash); + } + + // As a last ditch effort, get the local app data directory and if a vendor + // name exists append it. If only a product name exists, append it. If neither + // exist fallback to old handling. We don't use the product name on purpose + // because we want a shared update directory for different apps run from the + // same path. nsCOMPtr localDir; - if (pathHashResult && (hasVendor || gAppData->name) && + if ((hasVendor || gAppData->name) && NS_SUCCEEDED(GetUserDataDirectoryHome(getter_AddRefs(localDir), true)) && NS_SUCCEEDED(localDir->AppendNative(nsDependentCString(hasVendor ? gAppData->vendor : gAppData->name))) && From 847cb6d2e8457a20a812ed2ff554e5367377efc4 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Wed, 22 Mar 2017 14:57:25 -0400 Subject: [PATCH 280/300] Bug 1347632 - make RecordedSourceSurfaceCreation fallible. r=tobytailor MozReview-Commit-ID: G4x3zTluGb4 --- gfx/2d/RecordedEvent.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/gfx/2d/RecordedEvent.cpp b/gfx/2d/RecordedEvent.cpp index 6d3688ac05f36..370ac98d1ffe3 100644 --- a/gfx/2d/RecordedEvent.cpp +++ b/gfx/2d/RecordedEvent.cpp @@ -1299,6 +1299,10 @@ RecordedSourceSurfaceCreation::~RecordedSourceSurfaceCreation() bool RecordedSourceSurfaceCreation::PlayEvent(Translator *aTranslator) const { + if (!mData) { + return false; + } + RefPtr src = aTranslator->GetReferenceDrawTarget()-> CreateSourceSurfaceFromData(mData, mSize, mSize.width * BytesPerPixel(mFormat), mFormat); aTranslator->AddSourceSurface(mRefPtr, src); @@ -1311,6 +1315,7 @@ RecordedSourceSurfaceCreation::RecordToStream(ostream &aStream) const WriteElement(aStream, mRefPtr); WriteElement(aStream, mSize); WriteElement(aStream, mFormat); + MOZ_ASSERT(mData); for (int y = 0; y < mSize.height; y++) { aStream.write((const char*)mData + y * mStride, BytesPerPixel(mFormat) * mSize.width); } @@ -1322,8 +1327,12 @@ RecordedSourceSurfaceCreation::RecordedSourceSurfaceCreation(istream &aStream) ReadElement(aStream, mRefPtr); ReadElement(aStream, mSize); ReadElement(aStream, mFormat); - mData = (uint8_t*)new char[mSize.width * mSize.height * BytesPerPixel(mFormat)]; - aStream.read((char*)mData, mSize.width * mSize.height * BytesPerPixel(mFormat)); + mData = (uint8_t*)new (fallible) char[mSize.width * mSize.height * BytesPerPixel(mFormat)]; + if (!mData) { + gfxWarning() << "RecordedSourceSurfaceCreation failed to allocate data"; + } else { + aStream.read((char*)mData, mSize.width * mSize.height * BytesPerPixel(mFormat)); + } } void From eff6acfa7814d266b2aabc46c41677eb50d63a90 Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Tue, 21 Mar 2017 22:34:03 -0400 Subject: [PATCH 281/300] Bug 1285533. Remove non-fontconfig platform fontlist codepath. r=lsalzman This has been disabled for two years. It's time for it to die. --- accessible/base/TextAttrs.cpp | 34 +++---------- gfx/thebes/gfxPlatform.cpp | 18 ++----- gfx/thebes/gfxPlatformGtk.cpp | 94 ++++++++--------------------------- gfx/thebes/gfxPlatformGtk.h | 6 --- gfx/thebes/gfxTextRun.cpp | 14 ------ layout/base/nsPresContext.cpp | 14 +----- modules/libpref/init/all.js | 6 --- 7 files changed, 33 insertions(+), 153 deletions(-) diff --git a/accessible/base/TextAttrs.cpp b/accessible/base/TextAttrs.cpp index cb66d1380b9c8..f6e6d85199728 100644 --- a/accessible/base/TextAttrs.cpp +++ b/accessible/base/TextAttrs.cpp @@ -18,10 +18,6 @@ #include "mozilla/AppUnits.h" #include "mozilla/gfx/2D.h" -#if defined(MOZ_WIDGET_GTK) -#include "gfxPlatformGtk.h" // xxx - for UseFcFontList -#endif - using namespace mozilla; using namespace mozilla::a11y; @@ -652,28 +648,14 @@ TextAttrsMgr::FontWeightTextAttr:: if (font->IsSyntheticBold()) return 700; - bool useFontEntryWeight = true; - - // Under Linux, when gfxPangoFontGroup code is used, - // font->GetStyle()->weight will give the absolute weight requested of the - // font face. The gfxPangoFontGroup code uses the gfxFontEntry constructor - // which doesn't initialize the weight field. -#if defined(MOZ_WIDGET_GTK) - useFontEntryWeight = gfxPlatformGtk::UseFcFontList(); -#endif - - if (useFontEntryWeight) { - // On Windows, font->GetStyle()->weight will give the same weight as - // fontEntry->Weight(), the weight of the first font in the font group, - // which may not be the weight of the font face used to render the - // characters. On Mac, font->GetStyle()->weight will just give the same - // number as getComputedStyle(). fontEntry->Weight() will give the weight - // of the font face used. - gfxFontEntry *fontEntry = font->GetFontEntry(); - return fontEntry->Weight(); - } else { - return font->GetStyle()->weight; - } + // On Windows, font->GetStyle()->weight will give the same weight as + // fontEntry->Weight(), the weight of the first font in the font group, + // which may not be the weight of the font face used to render the + // characters. On Mac, font->GetStyle()->weight will just give the same + // number as getComputedStyle(). fontEntry->Weight() will give the weight + // of the font face used. + gfxFontEntry *fontEntry = font->GetFontEntry(); + return fontEntry->Weight(); } //////////////////////////////////////////////////////////////////////////////// diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 95536eea123dc..9a4bd2ae07cdc 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -88,10 +88,6 @@ #include "GLContextProvider.h" #include "mozilla/gfx/Logging.h" -#if defined(MOZ_WIDGET_GTK) -#include "gfxPlatformGtk.h" // xxx - for UseFcFontList -#endif - #ifdef MOZ_WIDGET_ANDROID #include "TexturePoolOGL.h" #include "mozilla/layers/UiCompositorControllerChild.h" @@ -711,17 +707,9 @@ gfxPlatform::Init() gPlatform->ComputeTileSize(); nsresult rv; - - bool usePlatformFontList = true; -#if defined(MOZ_WIDGET_GTK) - usePlatformFontList = gfxPlatformGtk::UseFcFontList(); -#endif - - if (usePlatformFontList) { - rv = gfxPlatformFontList::Init(); - if (NS_FAILED(rv)) { - MOZ_CRASH("Could not initialize gfxPlatformFontList"); - } + rv = gfxPlatformFontList::Init(); + if (NS_FAILED(rv)) { + MOZ_CRASH("Could not initialize gfxPlatformFontList"); } gPlatform->mScreenReferenceSurface = diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp index 501389934abd0..a7629ed5916bc 100644 --- a/gfx/thebes/gfxPlatformGtk.cpp +++ b/gfx/thebes/gfxPlatformGtk.cpp @@ -67,23 +67,14 @@ using namespace mozilla; using namespace mozilla::gfx; using namespace mozilla::unicode; -gfxFontconfigUtils *gfxPlatformGtk::sFontconfigUtils = nullptr; - #if (MOZ_WIDGET_GTK == 2) static cairo_user_data_key_t cairo_gdk_drawable_key; #endif -bool gfxPlatformGtk::sUseFcFontList = false; - gfxPlatformGtk::gfxPlatformGtk() { gtk_init(nullptr, nullptr); - sUseFcFontList = mozilla::Preferences::GetBool("gfx.font_rendering.fontconfig.fontlist.enabled"); - if (!sUseFcFontList && !sFontconfigUtils) { - sFontconfigUtils = gfxFontconfigUtils::GetFontconfigUtils(); - } - mMaxGenericSubstitutions = UNINITIALIZED_VALUE; #ifdef MOZ_X11 @@ -117,12 +108,6 @@ gfxPlatformGtk::gfxPlatformGtk() gfxPlatformGtk::~gfxPlatformGtk() { - if (!sUseFcFontList) { - gfxFontconfigUtils::Shutdown(); - sFontconfigUtils = nullptr; - gfxPangoFontGroup::Shutdown(); - } - #ifdef MOZ_X11 if (mCompositorDisplay) { XCloseDisplay(mCompositorDisplay); @@ -200,27 +185,17 @@ gfxPlatformGtk::GetFontList(nsIAtom *aLangGroup, const nsACString& aGenericFamily, nsTArray& aListOfFonts) { - if (sUseFcFontList) { - gfxPlatformFontList::PlatformFontList()->GetFontList(aLangGroup, - aGenericFamily, - aListOfFonts); - return NS_OK; - } - - return sFontconfigUtils->GetFontList(aLangGroup, - aGenericFamily, - aListOfFonts); + gfxPlatformFontList::PlatformFontList()->GetFontList(aLangGroup, + aGenericFamily, + aListOfFonts); + return NS_OK; } nsresult gfxPlatformGtk::UpdateFontList() { - if (sUseFcFontList) { - gfxPlatformFontList::PlatformFontList()->UpdateFontList(); - return NS_OK; - } - - return sFontconfigUtils->UpdateFontList(); + gfxPlatformFontList::PlatformFontList()->UpdateFontList(); + return NS_OK; } // xxx - this is ubuntu centric, need to go through other distros and flesh @@ -287,13 +262,9 @@ gfxPlatformGtk::CreatePlatformFontList() nsresult gfxPlatformGtk::GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName) { - if (sUseFcFontList) { - gfxPlatformFontList::PlatformFontList()-> - GetStandardFamilyName(aFontName, aFamilyName); - return NS_OK; - } - - return sFontconfigUtils->GetStandardFamilyName(aFontName, aFamilyName); + gfxPlatformFontList::PlatformFontList()-> + GetStandardFamilyName(aFontName, aFamilyName); + return NS_OK; } gfxFontGroup * @@ -303,13 +274,8 @@ gfxPlatformGtk::CreateFontGroup(const FontFamilyList& aFontFamilyList, gfxUserFontSet* aUserFontSet, gfxFloat aDevToCssSize) { - if (sUseFcFontList) { - return new gfxFontGroup(aFontFamilyList, aStyle, aTextPerf, - aUserFontSet, aDevToCssSize); - } - - return new gfxPangoFontGroup(aFontFamilyList, aStyle, - aUserFontSet, aDevToCssSize); + return new gfxFontGroup(aFontFamilyList, aStyle, aTextPerf, + aUserFontSet, aDevToCssSize); } gfxFontEntry* @@ -318,14 +284,9 @@ gfxPlatformGtk::LookupLocalFont(const nsAString& aFontName, int16_t aStretch, uint8_t aStyle) { - if (sUseFcFontList) { - gfxPlatformFontList* pfl = gfxPlatformFontList::PlatformFontList(); - return pfl->LookupLocalFont(aFontName, aWeight, aStretch, - aStyle); - } - - return gfxPangoFontGroup::NewFontEntry(aFontName, aWeight, - aStretch, aStyle); + gfxPlatformFontList* pfl = gfxPlatformFontList::PlatformFontList(); + return pfl->LookupLocalFont(aFontName, aWeight, aStretch, + aStyle); } gfxFontEntry* @@ -336,26 +297,15 @@ gfxPlatformGtk::MakePlatformFont(const nsAString& aFontName, const uint8_t* aFontData, uint32_t aLength) { - if (sUseFcFontList) { - gfxPlatformFontList* pfl = gfxPlatformFontList::PlatformFontList(); - return pfl->MakePlatformFont(aFontName, aWeight, aStretch, - aStyle, aFontData, aLength); - } - - // passing ownership of the font data to the new font entry - return gfxPangoFontGroup::NewFontEntry(aFontName, aWeight, - aStretch, aStyle, - aFontData, aLength); + gfxPlatformFontList* pfl = gfxPlatformFontList::PlatformFontList(); + return pfl->MakePlatformFont(aFontName, aWeight, aStretch, + aStyle, aFontData, aLength); } FT_Library gfxPlatformGtk::GetFTLibrary() { - if (sUseFcFontList) { - return gfxFcPlatformFontList::GetFTLibrary(); - } - - return gfxPangoFontGroup::GetFTLibrary(); + return gfxFcPlatformFontList::GetFTLibrary(); } bool @@ -447,11 +397,9 @@ void gfxPlatformGtk::FontsPrefsChanged(const char *aPref) } mMaxGenericSubstitutions = UNINITIALIZED_VALUE; - if (sUseFcFontList) { - gfxFcPlatformFontList* pfl = gfxFcPlatformFontList::PlatformFontList(); - pfl->ClearGenericMappings(); - FlushFontAndWordCaches(); - } + gfxFcPlatformFontList* pfl = gfxFcPlatformFontList::PlatformFontList(); + pfl->ClearGenericMappings(); + FlushFontAndWordCaches(); } uint32_t gfxPlatformGtk::MaxGenericSubstitions() diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h index 25706de85bf80..baa4353cab372 100644 --- a/gfx/thebes/gfxPlatformGtk.h +++ b/gfx/thebes/gfxPlatformGtk.h @@ -113,8 +113,6 @@ class gfxPlatformGtk : public gfxPlatform { } #endif - static bool UseFcFontList() { return sUseFcFontList; } - bool UseImageOffscreenSurfaces(); virtual gfxImageFormat GetOffscreenFormat() override; @@ -158,10 +156,6 @@ class gfxPlatformGtk : public gfxPlatform { #ifdef MOZ_X11 Display* mCompositorDisplay; #endif - - // xxx - this will be removed once the new fontconfig platform font list - // replaces gfxPangoFontGroup - static bool sUseFcFontList; }; #endif /* GFX_PLATFORM_GTK_H */ diff --git a/gfx/thebes/gfxTextRun.cpp b/gfx/thebes/gfxTextRun.cpp index e32d50c891464..8f6c359a78bdc 100644 --- a/gfx/thebes/gfxTextRun.cpp +++ b/gfx/thebes/gfxTextRun.cpp @@ -28,10 +28,6 @@ #include "mozilla/gfx/Logging.h" // for gfxCriticalError #include "mozilla/UniquePtr.h" -#if defined(MOZ_WIDGET_GTK) -#include "gfxPlatformGtk.h" // xxx - for UseFcFontList -#endif - #ifdef XP_WIN #include "gfxWindowsPlatform.h" #endif @@ -1730,16 +1726,6 @@ gfxFontGroup::~gfxFontGroup() void gfxFontGroup::BuildFontList() { - bool enumerateFonts = true; - -#if defined(MOZ_WIDGET_GTK) - // xxx - eliminate this once gfxPangoFontGroup is no longer needed - enumerateFonts = gfxPlatformGtk::UseFcFontList(); -#endif - if (!enumerateFonts) { - return; - } - // initialize fonts in the font family list AutoTArray fonts; gfxPlatformFontList *pfl = gfxPlatformFontList::PlatformFontList(); diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index ca1234ac16fa7..970427db77f7a 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -82,11 +82,6 @@ #include "mozilla/dom/PerformanceTiming.h" #include "mozilla/layers/APZThreadUtils.h" -#if defined(MOZ_WIDGET_GTK) -#include "gfxPlatformGtk.h" // xxx - for UseFcFontList -#endif - - // Needed for Start/Stop of Image Animation #include "imgIContainer.h" #include "nsIImageLoadingContent.h" @@ -2214,19 +2209,12 @@ nsPresContext::UserFontSetUpdated(gfxUserFontEntry* aUpdatedFont) if (!mShell) return; - bool usePlatformFontList = true; -#if defined(MOZ_WIDGET_GTK) - usePlatformFontList = gfxPlatformGtk::UseFcFontList(); -#endif - - // xxx - until the Linux platform font list is always used, use full - // restyle to force updates with gfxPangoFontGroup usage // Note: this method is called without a font when rules in the userfont set // are updated, which may occur during reflow as a result of the lazy // initialization of the userfont set. It would be better to avoid a full // restyle but until this method is only called outside of reflow, schedule a // full restyle in these cases. - if (!usePlatformFontList || !aUpdatedFont) { + if (!aUpdatedFont) { PostRebuildAllStyleDataEvent(NS_STYLE_HINT_REFLOW, eRestyle_ForceDescendants); return; } diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index edeea402fe3f0..8887ee65770e9 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -4204,13 +4204,7 @@ pref("intl.ime.use_simple_context_on_password_field", true); pref("intl.ime.use_simple_context_on_password_field", false); #endif -# enable new platform fontlist for linux on GTK platforms -# temporary pref to allow flipping back to the existing -# gfxPangoFontGroup/gfxFontconfigUtils code for handling system fonts - #ifdef MOZ_WIDGET_GTK -pref("gfx.font_rendering.fontconfig.fontlist.enabled", true); - // maximum number of fonts to substitute for a generic pref("gfx.font_rendering.fontconfig.max_generic_substitutions", 3); #endif From 3bc804b6e1d77cbf059b07025c5f6db9ea6ad108 Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Wed, 22 Mar 2017 12:00:02 -0400 Subject: [PATCH 282/300] Bug 1119128. Eliminate gfxPangoFontGroup and gfxFontconfigUtils. r=lsalzman --- build/valgrind/i386-redhat-linux-gnu.sup | 10 - build/valgrind/x86_64-redhat-linux-gnu.sup | 10 - gfx/thebes/gfxFontconfigFonts.cpp | 2262 -------------------- gfx/thebes/gfxFontconfigFonts.h | 99 - gfx/thebes/gfxFontconfigUtils.cpp | 1100 ---------- gfx/thebes/gfxFontconfigUtils.h | 281 +-- gfx/thebes/gfxTextRun.cpp | 5 +- gfx/thebes/gfxTextRun.h | 3 - gfx/thebes/gfxUserFontSet.cpp | 26 - gfx/thebes/gfxUserFontSet.h | 8 - gfx/thebes/moz.build | 2 - 11 files changed, 4 insertions(+), 3802 deletions(-) delete mode 100644 gfx/thebes/gfxFontconfigFonts.cpp delete mode 100644 gfx/thebes/gfxFontconfigUtils.cpp diff --git a/build/valgrind/i386-redhat-linux-gnu.sup b/build/valgrind/i386-redhat-linux-gnu.sup index c1d39cd244822..cfdc37bb00093 100644 --- a/build/valgrind/i386-redhat-linux-gnu.sup +++ b/build/valgrind/i386-redhat-linux-gnu.sup @@ -18,16 +18,6 @@ obj:/lib/libdbus-1.so.3.4.0 ... } -{ - Bug 793600 - Memcheck:Leak - fun:realloc - obj:/usr/lib/libfontconfig.so.1.4.4 - ... - fun:FcDefaultSubstitute - fun:_ZN17gfxPangoFontGroup11MakeFontSetEP14_PangoLanguagedP9nsAutoRefI10_FcPatternE - ... -} { Bug 794366 Memcheck:Leak diff --git a/build/valgrind/x86_64-redhat-linux-gnu.sup b/build/valgrind/x86_64-redhat-linux-gnu.sup index 06435e4665268..aa8fb80a742d2 100644 --- a/build/valgrind/x86_64-redhat-linux-gnu.sup +++ b/build/valgrind/x86_64-redhat-linux-gnu.sup @@ -18,16 +18,6 @@ obj:/lib64/libdbus-1.so.3.4.0 ... } -{ - Bug 793600 - Memcheck:Leak - fun:realloc - obj:/usr/lib64/libfontconfig.so.1.4.4 - ... - fun:FcDefaultSubstitute - fun:_ZN17gfxPangoFontGroup11MakeFontSetEP14_PangoLanguagedP9nsAutoRefI10_FcPatternE - ... -} # Fontconfig is going fancy with its cache structure and that confuses valgrind. # https://bugs.freedesktop.org/show_bug.cgi?id=8215 # https://bugs.freedesktop.org/show_bug.cgi?id=8428 diff --git a/gfx/thebes/gfxFontconfigFonts.cpp b/gfx/thebes/gfxFontconfigFonts.cpp deleted file mode 100644 index bbcbbabf9159d..0000000000000 --- a/gfx/thebes/gfxFontconfigFonts.cpp +++ /dev/null @@ -1,2262 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "prlink.h" -#include "gfxTypes.h" - -#include "nsTArray.h" - -#include "gfxContext.h" -#ifdef MOZ_WIDGET_GTK -#include "gfxPlatformGtk.h" -#endif -#include "gfxFontconfigFonts.h" -#include "gfxFT2FontBase.h" -#include "gfxFT2Utils.h" -#include "harfbuzz/hb.h" -#include "harfbuzz/hb-glib.h" -#include "harfbuzz/hb-ot.h" -#include "nsUnicodeProperties.h" -#include "nsUnicodeScriptCodes.h" -#include "gfxFontconfigUtils.h" -#include "gfxUserFontSet.h" -#include "gfxFontConstants.h" -#include "nsGkAtoms.h" -#include "nsILanguageAtomService.h" -#include "nsServiceManagerUtils.h" - -#include -#include -#include "mozilla/gfx/HelpersCairo.h" - -#include -#include - -#include FT_TRUETYPE_TABLES_H - -#ifdef MOZ_WIDGET_GTK -#include -#endif - -#include - -using namespace mozilla; -using namespace mozilla::unicode; - -#define PRINTING_FC_PROPERTY "gfx.printing" - -static PangoLanguage *GuessPangoLanguage(nsIAtom *aLanguage); - -static cairo_scaled_font_t * -CreateScaledFont(FcPattern *aPattern, cairo_font_face_t *aFace); - -static FT_Library gFTLibrary; - -// FC_FAMILYLANG and FC_FULLNAME were introduced in fontconfig-2.2.97 -// and so fontconfig-2.3.0 (2005). -#ifndef FC_FAMILYLANG -#define FC_FAMILYLANG "familylang" -#endif -#ifndef FC_FULLNAME -#define FC_FULLNAME "fullname" -#endif - -static PRFuncPtr -FindFunctionSymbol(const char *name) -{ - PRLibrary *lib = nullptr; - PRFuncPtr result = PR_FindFunctionSymbolAndLibrary(name, &lib); - if (lib) { - PR_UnloadLibrary(lib); - } - - return result; -} - -static bool HasChar(FcPattern *aFont, FcChar32 wc) -{ - FcCharSet *charset = nullptr; - FcPatternGetCharSet(aFont, FC_CHARSET, 0, &charset); - - return charset && FcCharSetHasChar(charset, wc); -} - -/** - * gfxFcFontEntry: - * - * An abstract base class of for gfxFontEntry implementations used by - * gfxFcFont and gfxUserFontSet. - */ - -class gfxFcFontEntry : public gfxFontEntry { -public: - // For all FontEntrys attached to gfxFcFonts, there will be only one - // pattern in this array. This is always a font pattern, not a fully - // resolved pattern. gfxFcFont only uses this to construct a PangoFont. - // - // FontEntrys for src:local() fonts in gfxUserFontSet may return more than - // one pattern. (See comment in gfxUserFcFontEntry.) - const nsTArray< nsCountedRef >& GetPatterns() - { - return mPatterns; - } - - static gfxFcFontEntry *LookupFontEntry(cairo_font_face_t *aFace) - { - return static_cast - (cairo_font_face_get_user_data(aFace, &sFontEntryKey)); - } - - // override the gfxFontEntry impl to read the name from fontconfig - // instead of trying to get the 'name' table, as we don't implement - // GetFontTable() here - virtual nsString RealFaceName(); - - // This is needed to make gfxFontEntry::HasCharacter(aCh) work. - virtual bool TestCharacterMap(uint32_t aCh) - { - for (uint32_t i = 0; i < mPatterns.Length(); ++i) { - if (HasChar(mPatterns[i], aCh)) { - return true; - } - } - return false; - } - -protected: - explicit gfxFcFontEntry(const nsAString& aName) - : gfxFontEntry(aName) - { - } - - // One pattern is the common case and some subclasses rely on successful - // addition of the first element to the array. - AutoTArray,1> mPatterns; - - static cairo_user_data_key_t sFontEntryKey; -}; - -cairo_user_data_key_t gfxFcFontEntry::sFontEntryKey; - -nsString -gfxFcFontEntry::RealFaceName() -{ - FcChar8 *name; - if (!mPatterns.IsEmpty()) { - if (FcPatternGetString(mPatterns[0], - FC_FULLNAME, 0, &name) == FcResultMatch) { - return NS_ConvertUTF8toUTF16((const char*)name); - } - if (FcPatternGetString(mPatterns[0], - FC_FAMILY, 0, &name) == FcResultMatch) { - NS_ConvertUTF8toUTF16 result((const char*)name); - if (FcPatternGetString(mPatterns[0], - FC_STYLE, 0, &name) == FcResultMatch) { - result.Append(' '); - AppendUTF8toUTF16((const char*)name, result); - } - return result; - } - } - // fall back to gfxFontEntry implementation (only works for sfnt fonts) - return gfxFontEntry::RealFaceName(); -} - -/** - * gfxSystemFcFontEntry: - * - * An implementation of gfxFcFontEntry used by gfxFcFonts for system fonts, - * including those from regular family-name based font selection as well as - * those from src:local(). - * - * All gfxFcFonts using the same cairo_font_face_t share the same FontEntry. - */ - -class gfxSystemFcFontEntry : public gfxFcFontEntry { -public: - // For memory efficiency, aFontPattern should be a font pattern, - // not a fully resolved pattern. - gfxSystemFcFontEntry(cairo_font_face_t *aFontFace, - FcPattern *aFontPattern, - const nsAString& aName) - : gfxFcFontEntry(aName), mFontFace(aFontFace), - mFTFace(nullptr), mFTFaceInitialized(false) - { - cairo_font_face_reference(mFontFace); - cairo_font_face_set_user_data(mFontFace, &sFontEntryKey, this, nullptr); - - // mPatterns is an AutoTArray with 1 space always available, so the - // AppendElement always succeeds. - // FIXME: Make this infallible after bug 968520 is done. - MOZ_ALWAYS_TRUE(mPatterns.AppendElement(fallible)); - mPatterns[0] = aFontPattern; - - FcChar8 *name; - if (FcPatternGetString(aFontPattern, - FC_FAMILY, 0, &name) == FcResultMatch) { - mFamilyName = NS_ConvertUTF8toUTF16((const char*)name); - } - } - - ~gfxSystemFcFontEntry() - { - cairo_font_face_set_user_data(mFontFace, - &sFontEntryKey, - nullptr, - nullptr); - cairo_font_face_destroy(mFontFace); - } - - virtual void ForgetHBFace() override; - virtual void ReleaseGrFace(gr_face* aFace) override; - -protected: - virtual nsresult - CopyFontTable(uint32_t aTableTag, nsTArray& aBuffer) override; - - void MaybeReleaseFTFace(); - -private: - cairo_font_face_t *mFontFace; - FT_Face mFTFace; - bool mFTFaceInitialized; -}; - -nsresult -gfxSystemFcFontEntry::CopyFontTable(uint32_t aTableTag, - nsTArray& aBuffer) -{ - if (!mFTFaceInitialized) { - mFTFaceInitialized = true; - FcChar8 *filename; - if (FcPatternGetString(mPatterns[0], FC_FILE, 0, &filename) != FcResultMatch) { - return NS_ERROR_FAILURE; - } - int index; - if (FcPatternGetInteger(mPatterns[0], FC_INDEX, 0, &index) != FcResultMatch) { - index = 0; // default to 0 if not found in pattern - } - if (FT_New_Face(gfxPangoFontGroup::GetFTLibrary(), - (const char*)filename, index, &mFTFace) != 0) { - return NS_ERROR_FAILURE; - } - } - - if (!mFTFace) { - return NS_ERROR_NOT_AVAILABLE; - } - - FT_ULong length = 0; - if (FT_Load_Sfnt_Table(mFTFace, aTableTag, 0, nullptr, &length) != 0) { - return NS_ERROR_NOT_AVAILABLE; - } - if (!aBuffer.SetLength(length, fallible)) { - return NS_ERROR_OUT_OF_MEMORY; - } - if (FT_Load_Sfnt_Table(mFTFace, aTableTag, 0, aBuffer.Elements(), &length) != 0) { - aBuffer.Clear(); - return NS_ERROR_FAILURE; - } - - return NS_OK; -} - -void -gfxSystemFcFontEntry::MaybeReleaseFTFace() -{ - // don't release if either HB or Gr face still exists - if (mHBFace || mGrFace) { - return; - } - if (mFTFace) { - FT_Done_Face(mFTFace); - mFTFace = nullptr; - } - mFTFaceInitialized = false; -} - -void -gfxSystemFcFontEntry::ForgetHBFace() -{ - gfxFontEntry::ForgetHBFace(); - MaybeReleaseFTFace(); -} - -void -gfxSystemFcFontEntry::ReleaseGrFace(gr_face* aFace) -{ - gfxFontEntry::ReleaseGrFace(aFace); - MaybeReleaseFTFace(); -} - -// A namespace for @font-face family names in FcPatterns so that fontconfig -// aliases do not pick up families from @font-face rules and so that -// fontconfig rules can distinguish between web fonts and platform fonts. -// http://lists.freedesktop.org/archives/fontconfig/2008-November/003037.html -#define FONT_FACE_FAMILY_PREFIX "@font-face:" - -/** - * gfxUserFcFontEntry: - * - * An abstract class for objects in a gfxUserFontSet that can provide - * FcPattern* handles to fonts. - * - * Separate implementations of this class support local fonts from src:local() - * and web fonts from src:url(). - */ - -// There is a one-to-one correspondence between gfxUserFcFontEntry objects and -// @font-face rules, but sometimes a one-to-many correspondence between font -// entries and font patterns. -// -// http://www.w3.org/TR/2002/WD-css3-webfonts-20020802#font-descriptions -// provided a font-size descriptor to specify the sizes supported by the face, -// but the "Editor's Draft 27 June 2008" -// http://dev.w3.org/csswg/css3-fonts/#font-resources does not provide such a -// descriptor, and Mozilla does not recognize such a descriptor. -// -// Font face names used in src:local() also do not usually specify a size. -// -// PCF format fonts have each size in a different file, and each of these -// files is referenced by its own pattern, but really these are each -// different sizes of one face with one name. -// -// Multiple patterns in an entry also effectively deals with a set of -// PostScript Type 1 font files that all have the same face name but are in -// several files because of the limit on the number of glyphs in a Type 1 font -// file. (e.g. Computer Modern.) - -class gfxUserFcFontEntry : public gfxFcFontEntry { -protected: - explicit gfxUserFcFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle) - : gfxFcFontEntry(aFontName) - { - mStyle = aStyle; - mWeight = aWeight; - mStretch = aStretch; - } - - // Helper function to change a pattern so that it matches the CSS style - // descriptors and so gets properly sorted in font selection. This also - // avoids synthetic style effects being added by the renderer when the - // style of the font itself does not match the descriptor provided by the - // author. - void AdjustPatternToCSS(FcPattern *aPattern); -}; - -void -gfxUserFcFontEntry::AdjustPatternToCSS(FcPattern *aPattern) -{ - int fontWeight = -1; - FcPatternGetInteger(aPattern, FC_WEIGHT, 0, &fontWeight); - int cssWeight = gfxFontconfigUtils::FcWeightForBaseWeight(mWeight / 100); - if (cssWeight != fontWeight) { - FcPatternDel(aPattern, FC_WEIGHT); - FcPatternAddInteger(aPattern, FC_WEIGHT, cssWeight); - } - - int fontSlant; - FcResult res = FcPatternGetInteger(aPattern, FC_SLANT, 0, &fontSlant); - // gfxFontEntry doesn't understand the difference between oblique - // and italic. - if (res != FcResultMatch || - IsItalic() != (fontSlant != FC_SLANT_ROMAN)) { - FcPatternDel(aPattern, FC_SLANT); - FcPatternAddInteger(aPattern, FC_SLANT, - IsItalic() ? FC_SLANT_OBLIQUE : FC_SLANT_ROMAN); - } - - int fontWidth = -1; - FcPatternGetInteger(aPattern, FC_WIDTH, 0, &fontWidth); - int cssWidth = gfxFontconfigUtils::FcWidthForThebesStretch(mStretch); - if (cssWidth != fontWidth) { - FcPatternDel(aPattern, FC_WIDTH); - FcPatternAddInteger(aPattern, FC_WIDTH, cssWidth); - } - - // Ensure that there is a fullname property (if there is a family - // property) so that fontconfig rules can identify the real name of the - // font, because the family property will be replaced. - FcChar8 *unused; - if (FcPatternGetString(aPattern, - FC_FULLNAME, 0, &unused) == FcResultNoMatch) { - nsAutoCString fullname; - if (gfxFontconfigUtils::GetFullnameFromFamilyAndStyle(aPattern, - &fullname)) { - FcPatternAddString(aPattern, FC_FULLNAME, - gfxFontconfigUtils::ToFcChar8(fullname)); - } - } - - nsAutoCString family; - family.Append(FONT_FACE_FAMILY_PREFIX); - AppendUTF16toUTF8(Name(), family); - - FcPatternDel(aPattern, FC_FAMILY); - FcPatternDel(aPattern, FC_FAMILYLANG); - FcPatternAddString(aPattern, FC_FAMILY, - gfxFontconfigUtils::ToFcChar8(family)); -} - -/** - * gfxLocalFcFontEntry: - * - * An implementation of gfxUserFcFontEntry for local fonts from src:local(). - * - * This class is used only in gfxUserFontSet and for providing FcPattern* - * handles to system fonts for font selection. gfxFcFonts created from these - * patterns will use gfxSystemFcFontEntrys, which may be shared with - * gfxFcFonts from regular family-name based font selection. - */ - -class gfxLocalFcFontEntry : public gfxUserFcFontEntry { -public: - gfxLocalFcFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle, - const nsTArray< nsCountedRef >& aPatterns) - : gfxUserFcFontEntry(aFontName, aWeight, aStretch, aStyle) - { - if (!mPatterns.SetCapacity(aPatterns.Length(), fallible)) - return; // OOM - - for (uint32_t i = 0; i < aPatterns.Length(); ++i) { - FcPattern *pattern = FcPatternDuplicate(aPatterns.ElementAt(i)); - if (!pattern) - return; // OOM - - AdjustPatternToCSS(pattern); - - // FIXME: Make this infallible after bug 968520 is done. - MOZ_ALWAYS_TRUE(mPatterns.AppendElement(fallible)); - mPatterns[i].own(pattern); - } - mIsLocalUserFont = true; - } -}; - -/** - * gfxDownloadedFcFontEntry: - * - * An implementation of gfxFcFontEntry for web fonts from src:url(). - * - * When a cairo_font_face_t is created for these fonts, the cairo_font_face_t - * keeps a reference to the FontEntry to keep the font data alive. - */ - -class gfxDownloadedFcFontEntry : public gfxUserFcFontEntry { -public: - // This takes ownership of the face and its underlying data - gfxDownloadedFcFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle, - const uint8_t *aData, FT_Face aFace) - : gfxUserFcFontEntry(aFontName, aWeight, aStretch, aStyle), - mFontData(aData), mFace(aFace) - { - NS_PRECONDITION(aFace != nullptr, "aFace is NULL!"); - mIsDataUserFont = true; - InitPattern(); - } - - virtual ~gfxDownloadedFcFontEntry(); - - // Returns true on success - bool SetCairoFace(cairo_font_face_t *aFace); - - virtual hb_blob_t* GetFontTable(uint32_t aTableTag) override; - -protected: - void InitPattern(); - - // mFontData holds the data used to instantiate the FT_Face; - // this has to persist until we are finished with the face, - // then be released with free(). - const uint8_t* mFontData; - - FT_Face mFace; -}; - -// A property for recording gfxDownloadedFcFontEntrys on FcPatterns. -static const char *kFontEntryFcProp = "-moz-font-entry"; - -static FcBool AddDownloadedFontEntry(FcPattern *aPattern, - gfxDownloadedFcFontEntry *aFontEntry) -{ - FcValue value; - value.type = FcTypeFTFace; // void* field of union - value.u.f = aFontEntry; - - return FcPatternAdd(aPattern, kFontEntryFcProp, value, FcFalse); -} - -static FcBool DelDownloadedFontEntry(FcPattern *aPattern) -{ - return FcPatternDel(aPattern, kFontEntryFcProp); -} - -static gfxDownloadedFcFontEntry *GetDownloadedFontEntry(FcPattern *aPattern) -{ - FcValue value; - if (FcPatternGet(aPattern, kFontEntryFcProp, 0, &value) != FcResultMatch) - return nullptr; - - if (value.type != FcTypeFTFace) { - NS_NOTREACHED("Wrong type for -moz-font-entry font property"); - return nullptr; - } - - return static_cast(value.u.f); -} - -gfxDownloadedFcFontEntry::~gfxDownloadedFcFontEntry() -{ - if (mPatterns.Length() != 0) { - // Remove back reference to this font entry and the face in case - // anyone holds a reference to the pattern. - NS_ASSERTION(mPatterns.Length() == 1, - "More than one pattern in gfxDownloadedFcFontEntry!"); - DelDownloadedFontEntry(mPatterns[0]); - FcPatternDel(mPatterns[0], FC_FT_FACE); - } - FT_Done_Face(mFace); - free((void*)mFontData); -} - -typedef FcPattern* (*QueryFaceFunction)(const FT_Face face, - const FcChar8 *file, int id, - FcBlanks *blanks); - -void -gfxDownloadedFcFontEntry::InitPattern() -{ - static QueryFaceFunction sQueryFacePtr = - reinterpret_cast - (FindFunctionSymbol("FcFreeTypeQueryFace")); - FcPattern *pattern; - - // FcFreeTypeQueryFace is the same function used to construct patterns for - // system fonts and so is the preferred function to use for this purpose. - // This will set up the langset property, which helps with sorting, and - // the foundry, fullname, and fontversion properties, which properly - // identify the font to fontconfig rules. However, FcFreeTypeQueryFace is - // available only from fontconfig-2.4.2 (December 2006). (CentOS 5.0 has - // fontconfig-2.4.1.) - if (sQueryFacePtr) { - // The "file" argument cannot be nullptr (in fontconfig-2.6.0 at - // least). The dummy file passed here is removed below. - // - // When fontconfig scans the system fonts, FcConfigGetBlanks(nullptr) - // is passed as the "blanks" argument, which provides that unexpectedly - // blank glyphs are elided. Here, however, we pass nullptr for - // "blanks", effectively assuming that, if the font has a blank glyph, - // then the author intends any associated character to be rendered - // blank. - pattern = - (*sQueryFacePtr)(mFace, - gfxFontconfigUtils::ToFcChar8(""), - 0, - nullptr); - if (!pattern) - // Either OOM, or fontconfig chose to skip this font because it - // has "no encoded characters", which I think means "BDF and PCF - // fonts which are not in Unicode (or the effectively equivalent - // ISO Latin-1) encoding". - return; - - // These properties don't make sense for this face without a file. - FcPatternDel(pattern, FC_FILE); - FcPatternDel(pattern, FC_INDEX); - - } else { - // Do the minimum necessary to construct a pattern for sorting. - - // FC_CHARSET is vital to determine which characters are supported. - nsAutoRef charset(FcFreeTypeCharSet(mFace, nullptr)); - // If there are no characters then assume we don't know how to read - // this font. - if (!charset || FcCharSetCount(charset) == 0) - return; - - pattern = FcPatternCreate(); - FcPatternAddCharSet(pattern, FC_CHARSET, charset); - - // FC_PIXEL_SIZE can be important for font selection of fixed-size - // fonts. - if (!(mFace->face_flags & FT_FACE_FLAG_SCALABLE)) { - for (FT_Int i = 0; i < mFace->num_fixed_sizes; ++i) { -#if HAVE_FT_BITMAP_SIZE_Y_PPEM - double size = FLOAT_FROM_26_6(mFace->available_sizes[i].y_ppem); -#else - double size = mFace->available_sizes[i].height; -#endif - FcPatternAddDouble (pattern, FC_PIXEL_SIZE, size); - } - - // Not sure whether this is important; - // imitating FcFreeTypeQueryFace: - FcPatternAddBool (pattern, FC_ANTIALIAS, FcFalse); - } - - // Setting up the FC_LANGSET property is very difficult with the APIs - // available prior to FcFreeTypeQueryFace. Having no FC_LANGSET - // property seems better than having a property with an empty LangSet. - // With no FC_LANGSET property, fontconfig sort functions will - // consider this face to have the same priority as (otherwise equal) - // faces that have support for the primary requested language, but - // will not consider any language to have been satisfied (and so will - // continue to look for a face with language support in fallback - // fonts). - } - - AdjustPatternToCSS(pattern); - - FcPatternAddFTFace(pattern, FC_FT_FACE, mFace); - AddDownloadedFontEntry(pattern, this); - - // There is never more than one pattern - // FIXME: Make this infallible after bug 968520 is done. - MOZ_ALWAYS_TRUE(mPatterns.AppendElement(fallible)); - mPatterns[0].own(pattern); -} - -static void ReleaseDownloadedFontEntry(void *data) -{ - gfxDownloadedFcFontEntry *downloadedFontEntry = - static_cast(data); - NS_RELEASE(downloadedFontEntry); -} - -bool gfxDownloadedFcFontEntry::SetCairoFace(cairo_font_face_t *aFace) -{ - if (CAIRO_STATUS_SUCCESS != - cairo_font_face_set_user_data(aFace, &sFontEntryKey, this, - ReleaseDownloadedFontEntry)) - return false; - - // Hold a reference to this font entry to keep the font face data. - NS_ADDREF(this); - return true; -} - -hb_blob_t * -gfxDownloadedFcFontEntry::GetFontTable(uint32_t aTableTag) -{ - // The entry already owns the (sanitized) sfnt data in mFontData, - // so we can just return a blob that "wraps" the appropriate chunk of it. - // The blob should not attempt to free its data, as the entire sfnt data - // will be freed when the font entry is deleted. - return gfxFontUtils::GetTableFromFontData(mFontData, aTableTag); -} - -/* - * gfxFcFont - * - * This is a gfxFont implementation using a CAIRO_FONT_TYPE_FT - * cairo_scaled_font created from an FcPattern. - */ - -class gfxFcFont : public gfxFontconfigFontBase { -public: - virtual ~gfxFcFont(); - static already_AddRefed - GetOrMakeFont(FcPattern *aRequestedPattern, FcPattern *aFontPattern, - const gfxFontStyle *aFontStyle); - - // return a cloned font resized and offset to simulate sub/superscript glyphs - virtual already_AddRefed - GetSubSuperscriptFont(int32_t aAppUnitsPerDevPixel) override; - -protected: - virtual already_AddRefed MakeScaledFont(gfxFontStyle *aFontStyle, - gfxFloat aFontScale); - virtual already_AddRefed GetSmallCapsFont() override; - -private: - gfxFcFont(cairo_scaled_font_t *aCairoFont, - FcPattern *aPattern, - gfxFcFontEntry *aFontEntry, - const gfxFontStyle *aFontStyle); - - // key for locating a gfxFcFont corresponding to a cairo_scaled_font - static cairo_user_data_key_t sGfxFontKey; -}; - -/** - * gfxFcFontSet: - * - * Translation from a desired FcPattern to a sorted set of font references - * (fontconfig cache data) and (when needed) fonts. - */ - -class gfxFcFontSet final { -public: - NS_INLINE_DECL_REFCOUNTING(gfxFcFontSet) - - explicit gfxFcFontSet(FcPattern *aPattern, - gfxUserFontSet *aUserFontSet) - : mSortPattern(aPattern), mUserFontSet(aUserFontSet), - mFcFontsTrimmed(0), - mHaveFallbackFonts(false) - { - bool waitForUserFont; - mFcFontSet = SortPreferredFonts(waitForUserFont); - mWaitingForUserFont = waitForUserFont; - } - - // A reference is held by the FontSet. - // The caller may add a ref to keep the font alive longer than the FontSet. - gfxFcFont *GetFontAt(uint32_t i, const gfxFontStyle *aFontStyle) - { - if (i >= mFonts.Length() || !mFonts[i].mFont) { - // GetFontPatternAt sets up mFonts - FcPattern *fontPattern = GetFontPatternAt(i); - if (!fontPattern) - return nullptr; - - mFonts[i].mFont = - gfxFcFont::GetOrMakeFont(mSortPattern, fontPattern, - aFontStyle); - } - return mFonts[i].mFont; - } - - FcPattern *GetFontPatternAt(uint32_t i); - - bool WaitingForUserFont() const { - return mWaitingForUserFont; - } - -private: - // Private destructor, to discourage deletion outside of Release(): - ~gfxFcFontSet() - { - } - - nsReturnRef SortPreferredFonts(bool& aWaitForUserFont); - nsReturnRef SortFallbackFonts(); - - struct FontEntry { - explicit FontEntry(FcPattern *aPattern) : mPattern(aPattern) {} - nsCountedRef mPattern; - RefPtr mFont; - }; - - struct LangSupportEntry { - LangSupportEntry(FcChar8 *aLang, FcLangResult aSupport) : - mLang(aLang), mBestSupport(aSupport) {} - FcChar8 *mLang; - FcLangResult mBestSupport; - }; - -public: - // public for nsTArray - class LangComparator { - public: - bool Equals(const LangSupportEntry& a, const FcChar8 *b) const - { - return FcStrCmpIgnoreCase(a.mLang, b) == 0; - } - }; - -private: - // The requested pattern - nsCountedRef mSortPattern; - // Fonts from @font-face rules - RefPtr mUserFontSet; - // A (trimmed) list of font patterns and fonts that is built up as - // required. - nsTArray mFonts; - // Holds a list of font patterns that will be trimmed. This is first set - // to a list of preferred fonts. Then, if/when all the preferred fonts - // have been trimmed and added to mFonts, this is set to a list of - // fallback fonts. - nsAutoRef mFcFontSet; - // The set of characters supported by the fonts in mFonts. - nsAutoRef mCharSet; - // The index of the next font in mFcFontSet that has not yet been - // considered for mFonts. - int mFcFontsTrimmed; - // True iff fallback fonts are either stored in mFcFontSet or have been - // trimmed and added to mFonts (so that mFcFontSet is nullptr). - bool mHaveFallbackFonts; - // True iff there was a user font set with pending downloads, - // so the set may be updated when downloads complete - bool mWaitingForUserFont; -}; - -// Find the FcPattern for an @font-face font suitable for CSS family |aFamily| -// and style |aStyle| properties. -static const nsTArray< nsCountedRef >* -FindFontPatterns(gfxUserFontSet *mUserFontSet, - const nsACString &aFamily, uint8_t aStyle, - uint16_t aWeight, int16_t aStretch, - bool& aWaitForUserFont) -{ - // Convert to UTF16 - NS_ConvertUTF8toUTF16 utf16Family(aFamily); - - // needsBold is not used here. Instead synthetic bold is enabled through - // FcFontRenderPrepare when the weight in the requested pattern is - // compared against the weight in the font pattern. - bool needsBold; - - gfxFontStyle style; - style.style = aStyle; - style.weight = aWeight; - style.stretch = aStretch; - - gfxUserFcFontEntry *fontEntry = nullptr; - gfxFontFamily *family = mUserFontSet->LookupFamily(utf16Family); - if (family) { - gfxUserFontEntry* userFontEntry = - mUserFontSet->FindUserFontEntryAndLoad(family, style, needsBold, - aWaitForUserFont); - if (userFontEntry) { - fontEntry = static_cast - (userFontEntry->GetPlatformFontEntry()); - } - - // Accept synthetic oblique for italic and oblique. - // xxx - this isn't really ideal behavior, for docs that only use a - // single italic face it will also pull down the normal face - // and probably never use it - if (!fontEntry && aStyle != NS_FONT_STYLE_NORMAL) { - style.style = NS_FONT_STYLE_NORMAL; - userFontEntry = - mUserFontSet->FindUserFontEntryAndLoad(family, style, - needsBold, - aWaitForUserFont); - if (userFontEntry) { - fontEntry = static_cast - (userFontEntry->GetPlatformFontEntry()); - } - } - } - - if (!fontEntry) { - return nullptr; - } - - return &fontEntry->GetPatterns(); -} - -typedef FcBool (*FcPatternRemoveFunction)(FcPattern *p, const char *object, - int id); - -// FcPatternRemove is available in fontconfig-2.3.0 (2005) -static FcBool -moz_FcPatternRemove(FcPattern *p, const char *object, int id) -{ - static FcPatternRemoveFunction sFcPatternRemovePtr = - reinterpret_cast - (FindFunctionSymbol("FcPatternRemove")); - - if (!sFcPatternRemovePtr) - return FcFalse; - - return (*sFcPatternRemovePtr)(p, object, id); -} - -// fontconfig prefers a matching family or lang to pixelsize of bitmap -// fonts. CSS suggests a tolerance of 20% on pixelsize. -static bool -SizeIsAcceptable(FcPattern *aFont, double aRequestedSize) -{ - double size; - int v = 0; - while (FcPatternGetDouble(aFont, - FC_PIXEL_SIZE, v, &size) == FcResultMatch) { - ++v; - if (5.0 * fabs(size - aRequestedSize) < aRequestedSize) - return true; - } - - // No size means scalable - return v == 0; -} - -// Sorting only the preferred fonts first usually saves having to sort through -// every font on the system. -nsReturnRef -gfxFcFontSet::SortPreferredFonts(bool &aWaitForUserFont) -{ - aWaitForUserFont = false; - - gfxFontconfigUtils *utils = gfxFontconfigUtils::GetFontconfigUtils(); - if (!utils) - return nsReturnRef(); - - // The list of families in mSortPattern has values with both weak and - // strong bindings. Values with strong bindings should be preferred. - // Values with weak bindings are default fonts that should be considered - // only when the font provides the best support for a requested language - // or after other fonts have satisfied all the requested languages. - // - // There are no direct fontconfig APIs to get the binding type. The - // binding only takes effect in the sort and match functions. - - // |requiredLangs| is a list of requested languages that have not yet been - // satisfied. gfxFontconfigUtils only sets one FC_LANG property value, - // but FcConfigSubstitute may add more values (e.g. prepending "en" to - // "ja" will use western fonts to render Latin/Arabic numerals in Japanese - // text.) - AutoTArray requiredLangs; - for (int v = 0; ; ++v) { - FcChar8 *lang; - FcResult result = FcPatternGetString(mSortPattern, FC_LANG, v, &lang); - if (result != FcResultMatch) { - // No need to check FcPatternGetLangSet() because - // gfxFontconfigUtils sets only a string value for FC_LANG and - // FcConfigSubstitute cannot add LangSets. - NS_ASSERTION(result != FcResultTypeMismatch, - "Expected a string for FC_LANG"); - break; - } - - if (!requiredLangs.Contains(lang, LangComparator())) { - FcLangResult bestLangSupport = utils->GetBestLangSupport(lang); - if (bestLangSupport != FcLangDifferentLang) { - requiredLangs. - AppendElement(LangSupportEntry(lang, bestLangSupport)); - } - } - } - - nsAutoRef fontSet(FcFontSetCreate()); - if (!fontSet) - return fontSet.out(); - - // FcDefaultSubstitute() ensures a slant on mSortPattern, but, if that ever - // doesn't happen, Roman will be used. - int requestedSlant = FC_SLANT_ROMAN; - FcPatternGetInteger(mSortPattern, FC_SLANT, 0, &requestedSlant); - double requestedSize = -1.0; - FcPatternGetDouble(mSortPattern, FC_PIXEL_SIZE, 0, &requestedSize); - - nsTHashtable existingFamilies(32); - FcChar8 *family; - for (int v = 0; - FcPatternGetString(mSortPattern, - FC_FAMILY, v, &family) == FcResultMatch; ++v) { - const nsTArray< nsCountedRef > *familyFonts = nullptr; - - // Is this an @font-face family? - bool isUserFont = false; - if (mUserFontSet) { - // Have some @font-face definitions - - nsDependentCString cFamily(gfxFontconfigUtils::ToCString(family)); - NS_NAMED_LITERAL_CSTRING(userPrefix, FONT_FACE_FAMILY_PREFIX); - - if (StringBeginsWith(cFamily, userPrefix)) { - isUserFont = true; - - // Trim off the prefix - nsDependentCSubstring cssFamily(cFamily, userPrefix.Length()); - - uint8_t thebesStyle = - gfxFontconfigUtils::FcSlantToThebesStyle(requestedSlant); - uint16_t thebesWeight = - gfxFontconfigUtils::GetThebesWeight(mSortPattern); - int16_t thebesStretch = - gfxFontconfigUtils::GetThebesStretch(mSortPattern); - - bool waitForUserFont; - familyFonts = FindFontPatterns(mUserFontSet, cssFamily, - thebesStyle, - thebesWeight, thebesStretch, - waitForUserFont); - if (waitForUserFont) { - aWaitForUserFont = true; - } - } - } - - if (!isUserFont) { - familyFonts = &utils->GetFontsForFamily(family); - } - - if (!familyFonts || familyFonts->Length() == 0) { - // There are no fonts matching this family, so there is no point - // in searching for this family in the FontSort. - // - // Perhaps the original pattern should be retained for - // FcFontRenderPrepare. However, the only a useful config - // substitution test against missing families that i can imagine - // would only be interested in the preferred family - // (qual="first"), so always keep the first family and use the - // same pattern for Sort and RenderPrepare. - if (v != 0 && moz_FcPatternRemove(mSortPattern, FC_FAMILY, v)) { - --v; - } - continue; - } - - // Aliases seem to often end up occurring more than once, but - // duplicate families can't be removed from the sort pattern without - // knowing whether duplicates have the same binding. - gfxFontconfigUtils::DepFcStrEntry *familyEntry = - existingFamilies.PutEntry(family); - if (familyEntry) { - if (familyEntry->mKey) // old entry - continue; - - familyEntry->mKey = family; // initialize new entry - } - - for (uint32_t f = 0; f < familyFonts->Length(); ++f) { - FcPattern *font = familyFonts->ElementAt(f); - - // Fix up the family name of user-font patterns, as the same - // font entry may be used (via the UserFontCache) for multiple - // CSS family names - if (isUserFont) { - font = FcPatternDuplicate(font); - FcPatternDel(font, FC_FAMILY); - FcPatternAddString(font, FC_FAMILY, family); - } - - // User fonts are already filtered by slant (but not size) in - // mUserFontSet->FindUserFontEntry(). - if (requestedSize != -1.0 && !SizeIsAcceptable(font, requestedSize)) - continue; - - for (uint32_t r = 0; r < requiredLangs.Length(); ++r) { - const LangSupportEntry& langEntry = requiredLangs[r]; - FcLangResult support = - gfxFontconfigUtils::GetLangSupport(font, langEntry.mLang); - if (support <= langEntry.mBestSupport) { // lower is better - requiredLangs.RemoveElementAt(r); - --r; - } - } - - // FcFontSetDestroy will remove a reference but FcFontSetAdd - // does _not_ take a reference! - if (FcFontSetAdd(fontSet, font)) { - // We don't add a reference here for user fonts, because we're - // using a local clone of the pattern (see above) in order to - // override the family name - if (!isUserFont) { - FcPatternReference(font); - } - } - } - } - - FcPattern *truncateMarker = nullptr; - for (uint32_t r = 0; r < requiredLangs.Length(); ++r) { - const nsTArray< nsCountedRef >& langFonts = - utils->GetFontsForLang(requiredLangs[r].mLang); - - bool haveLangFont = false; - for (uint32_t f = 0; f < langFonts.Length(); ++f) { - FcPattern *font = langFonts[f]; - if (requestedSize != -1.0 && !SizeIsAcceptable(font, requestedSize)) - continue; - - haveLangFont = true; - if (FcFontSetAdd(fontSet, font)) { - FcPatternReference(font); - } - } - - if (!haveLangFont && langFonts.Length() > 0) { - // There is a font that supports this language but it didn't pass - // the slant and size criteria. Weak default font families should - // not be considered until the language has been satisfied. - // - // Insert a font that supports the language so that it will mark - // the position of fonts from weak families in the sorted set and - // they can be removed. The language and weak families will be - // considered in the fallback fonts, which use fontconfig's - // algorithm. - // - // Of the fonts that don't meet slant and size criteria, strong - // default font families should be considered before (other) fonts - // for this language, so this marker font will be removed (as well - // as the fonts from weak families), and strong families will be - // reconsidered in the fallback fonts. - FcPattern *font = langFonts[0]; - if (FcFontSetAdd(fontSet, font)) { - FcPatternReference(font); - truncateMarker = font; - } - break; - } - } - - FcFontSet *sets[1] = { fontSet }; - FcResult result; -#ifdef SOLARIS - // Get around a crash of FcFontSetSort when FcConfig is nullptr - // Solaris's FcFontSetSort needs an FcConfig (bug 474758) - fontSet.own(FcFontSetSort(FcConfigGetCurrent(), sets, 1, mSortPattern, - FcFalse, nullptr, &result)); -#else - fontSet.own(FcFontSetSort(nullptr, sets, 1, mSortPattern, - FcFalse, nullptr, &result)); -#endif - - if (truncateMarker != nullptr && fontSet) { - nsAutoRef truncatedSet(FcFontSetCreate()); - - for (int f = 0; f < fontSet->nfont; ++f) { - FcPattern *font = fontSet->fonts[f]; - if (font == truncateMarker) - break; - - if (FcFontSetAdd(truncatedSet, font)) { - FcPatternReference(font); - } - } - - fontSet.steal(truncatedSet); - } - - return fontSet.out(); -} - -nsReturnRef -gfxFcFontSet::SortFallbackFonts() -{ - // Setting trim to FcTrue would provide a much smaller (~ 1/10) FcFontSet, - // but would take much longer due to comparing all the character sets. - // - // The references to fonts in this FcFontSet are almost free - // as they are pointers into mmaped cache files. - // - // GetFontPatternAt() will trim lazily if and as needed, which will also - // remove duplicates of preferred fonts. - FcResult result; - return nsReturnRef(FcFontSort(nullptr, mSortPattern, - FcFalse, nullptr, &result)); -} - -// GetFontAt relies on this setting up all patterns up to |i|. -FcPattern * -gfxFcFontSet::GetFontPatternAt(uint32_t i) -{ - while (i >= mFonts.Length()) { - while (!mFcFontSet) { - if (mHaveFallbackFonts) - return nullptr; - - mFcFontSet = SortFallbackFonts(); - mHaveFallbackFonts = true; - mFcFontsTrimmed = 0; - // Loop to test that mFcFontSet is non-nullptr. - } - - while (mFcFontsTrimmed < mFcFontSet->nfont) { - FcPattern *font = mFcFontSet->fonts[mFcFontsTrimmed]; - ++mFcFontsTrimmed; - - if (mFonts.Length() != 0) { - // See if the next font provides support for any extra - // characters. Most often the next font is not going to - // support more characters so check for a SubSet first before - // allocating a new CharSet with Union. - FcCharSet *supportedChars = mCharSet; - if (!supportedChars) { - FcPatternGetCharSet(mFonts[mFonts.Length() - 1].mPattern, - FC_CHARSET, 0, &supportedChars); - } - - if (supportedChars) { - FcCharSet *newChars = nullptr; - FcPatternGetCharSet(font, FC_CHARSET, 0, &newChars); - if (newChars) { - if (FcCharSetIsSubset(newChars, supportedChars)) - continue; - - mCharSet.own(FcCharSetUnion(supportedChars, newChars)); - } else if (!mCharSet) { - mCharSet.own(FcCharSetCopy(supportedChars)); - } - } - } - - mFonts.AppendElement(font); - if (mFonts.Length() >= i) - break; - } - - if (mFcFontsTrimmed == mFcFontSet->nfont) { - // finished with this font set - mFcFontSet.reset(); - } - } - - return mFonts[i].mPattern; -} - -#ifdef MOZ_WIDGET_GTK -static void ApplyGdkScreenFontOptions(FcPattern *aPattern); -#endif - -// Apply user settings and defaults to pattern in preparation for matching. -static void -PrepareSortPattern(FcPattern *aPattern, double aFallbackSize, - double aSizeAdjustFactor, bool aIsPrinterFont) -{ - FcConfigSubstitute(nullptr, aPattern, FcMatchPattern); - - // This gets cairo_font_options_t for the Screen. We should have - // different font options for printing (no hinting) but we are not told - // what we are measuring for. - // - // If cairo adds support for lcd_filter, gdk will not provide the default - // setting for that option. We could get the default setting by creating - // an xlib surface once, recording its font_options, and then merging the - // gdk options. - // - // Using an xlib surface would also be an option to get Screen font - // options for non-GTK X11 toolkits, but less efficient than using GDK to - // pick up dynamic changes. - if(aIsPrinterFont) { - cairo_font_options_t *options = cairo_font_options_create(); - cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); - cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); - cairo_ft_font_options_substitute(options, aPattern); - cairo_font_options_destroy(options); - FcPatternAddBool(aPattern, PRINTING_FC_PROPERTY, FcTrue); - } else { -#ifdef MOZ_WIDGET_GTK - ApplyGdkScreenFontOptions(aPattern); -#endif - } - - // Protect against any fontconfig settings that may have incorrectly - // modified the pixelsize, and consider aSizeAdjustFactor. - double size = aFallbackSize; - if (FcPatternGetDouble(aPattern, FC_PIXEL_SIZE, 0, &size) != FcResultMatch - || aSizeAdjustFactor != 1.0) { - FcPatternDel(aPattern, FC_PIXEL_SIZE); - FcPatternAddDouble(aPattern, FC_PIXEL_SIZE, size * aSizeAdjustFactor); - } - - FcDefaultSubstitute(aPattern); -} - -/** - ** gfxPangoFontGroup - **/ - -gfxPangoFontGroup::gfxPangoFontGroup(const FontFamilyList& aFontFamilyList, - const gfxFontStyle *aStyle, - gfxUserFontSet *aUserFontSet, - gfxFloat aDevToCssSize) - : gfxFontGroup(aFontFamilyList, aStyle, nullptr, aUserFontSet, aDevToCssSize), - mPangoLanguage(GuessPangoLanguage(aStyle->language)) -{ - // This language is passed to the font for shaping. - // Shaping doesn't know about lang groups so make it a real language. - if (mPangoLanguage) { - mStyle.language = NS_Atomize(pango_language_to_string(mPangoLanguage)); - } - - // dummy entry, will be replaced when actually needed - mFonts.AppendElement(FamilyFace()); - mSkipUpdateUserFonts = true; -} - -gfxPangoFontGroup::~gfxPangoFontGroup() -{ -} - -gfxFontGroup * -gfxPangoFontGroup::Copy(const gfxFontStyle *aStyle) -{ - return new gfxPangoFontGroup(mFamilyList, aStyle, mUserFontSet, mDevToCssSize); -} - -void -gfxPangoFontGroup::FindGenericFontsPFG(FontFamilyType aGenericType, - nsIAtom *aLanguage, - void *aClosure) -{ - AutoTArray resolvedGenerics; - ResolveGenericFontNamesPFG(aGenericType, aLanguage, resolvedGenerics); - uint32_t g = 0, numGenerics = resolvedGenerics.Length(); - for (g = 0; g < numGenerics; g++) { - FindPlatformFontPFG(resolvedGenerics[g], false, aClosure); - } -} - -/* static */ void -gfxPangoFontGroup::ResolveGenericFontNamesPFG(FontFamilyType aGenericType, - nsIAtom *aLanguage, - nsTArray& aGenericFamilies) -{ - static const char kGeneric_serif[] = "serif"; - static const char kGeneric_sans_serif[] = "sans-serif"; - static const char kGeneric_monospace[] = "monospace"; - static const char kGeneric_cursive[] = "cursive"; - static const char kGeneric_fantasy[] = "fantasy"; - - // treat -moz-fixed as monospace - if (aGenericType == eFamily_moz_fixed) { - aGenericType = eFamily_monospace; - } - - // type should be standard generic type at this point - NS_ASSERTION(aGenericType >= eFamily_serif && - aGenericType <= eFamily_fantasy, - "standard generic font family type required"); - - // create the lang string - nsIAtom *langGroupAtom = nullptr; - nsAutoCString langGroupString; - if (aLanguage) { - if (!gLangService) { - CallGetService(NS_LANGUAGEATOMSERVICE_CONTRACTID, &gLangService); - } - if (gLangService) { - nsresult rv; - langGroupAtom = gLangService->GetLanguageGroup(aLanguage, &rv); - } - } - if (!langGroupAtom) { - langGroupAtom = nsGkAtoms::Unicode; - } - langGroupAtom->ToUTF8String(langGroupString); - - // map generic type to string - const char *generic = nullptr; - switch (aGenericType) { - case eFamily_serif: - generic = kGeneric_serif; - break; - case eFamily_sans_serif: - generic = kGeneric_sans_serif; - break; - case eFamily_monospace: - generic = kGeneric_monospace; - break; - case eFamily_cursive: - generic = kGeneric_cursive; - break; - case eFamily_fantasy: - generic = kGeneric_fantasy; - break; - default: - break; - } - - if (!generic) { - return; - } - - aGenericFamilies.Clear(); - - // load family for "font.name.generic.lang" - nsAutoCString prefFontName("font.name."); - prefFontName.Append(generic); - prefFontName.Append('.'); - prefFontName.Append(langGroupString); - gfxFontUtils::AppendPrefsFontList(prefFontName.get(), - aGenericFamilies); - - // if lang has pref fonts, also load fonts for "font.name-list.generic.lang" - if (!aGenericFamilies.IsEmpty()) { - nsAutoCString prefFontListName("font.name-list."); - prefFontListName.Append(generic); - prefFontListName.Append('.'); - prefFontListName.Append(langGroupString); - gfxFontUtils::AppendPrefsFontList(prefFontListName.get(), - aGenericFamilies); - } - -#if 0 // dump out generic mappings - printf("%s ===> ", prefFontName.get()); - for (uint32_t k = 0; k < aGenericFamilies.Length(); k++) { - if (k > 0) printf(", "); - printf("%s", NS_ConvertUTF16toUTF8(aGenericFamilies[k]).get()); - } - printf("\n"); -#endif -} - -void gfxPangoFontGroup::EnumerateFontListPFG(nsIAtom *aLanguage, void *aClosure) -{ - // initialize fonts in the font family list - const nsTArray& fontlist = mFamilyList.GetFontlist(); - - // lookup fonts in the fontlist - uint32_t i, numFonts = fontlist.Length(); - for (i = 0; i < numFonts; i++) { - const FontFamilyName& name = fontlist[i]; - if (name.IsNamed()) { - FindPlatformFontPFG(name.mName, true, aClosure); - } else { - FindGenericFontsPFG(name.mType, aLanguage, aClosure); - } - } - - // if necessary, append default generic onto the end - if (mFamilyList.GetDefaultFontType() != eFamily_none && - !mFamilyList.HasDefaultGeneric()) { - FindGenericFontsPFG(mFamilyList.GetDefaultFontType(), - aLanguage, aClosure); - } -} - -void -gfxPangoFontGroup::FindPlatformFontPFG(const nsAString& fontName, - bool aUseFontSet, - void *aClosure) -{ - nsTArray *list = static_cast*>(aClosure); - - if (!list->Contains(fontName)) { - // names present in the user fontset are not matched against system fonts - if (aUseFontSet && mUserFontSet && mUserFontSet->HasFamily(fontName)) { - nsAutoString userFontName = - NS_LITERAL_STRING(FONT_FACE_FAMILY_PREFIX) + fontName; - list->AppendElement(userFontName); - } else { - list->AppendElement(fontName); - } - } -} - -gfxFcFont * -gfxPangoFontGroup::GetBaseFont() -{ - if (mFonts[0].Font() == nullptr) { - gfxFont* font = GetBaseFontSet()->GetFontAt(0, GetStyle()); - mFonts[0] = FamilyFace(nullptr, font); - } - - return static_cast(mFonts[0].Font()); -} - -gfxFont* -gfxPangoFontGroup::GetFirstValidFont(uint32_t aCh) -{ - return GetFontAt(0); -} - -gfxFont * -gfxPangoFontGroup::GetFontAt(int32_t i, uint32_t aCh) -{ - // If it turns out to be hard for all clients that cache font - // groups to call UpdateUserFonts at appropriate times, we could - // instead consider just calling UpdateUserFonts from someplace - // more central (such as here). - NS_ASSERTION(!mUserFontSet || mCurrGeneration == GetGeneration(), - "Whoever was caching this font group should have " - "called UpdateUserFonts on it"); - - NS_PRECONDITION(i == 0, "Only have one font"); - - return GetBaseFont(); -} - -void -gfxPangoFontGroup::UpdateUserFonts() -{ - uint64_t newGeneration = GetGeneration(); - if (newGeneration == mCurrGeneration) - return; - - mFonts[0] = FamilyFace(); - mFontSets.Clear(); - ClearCachedData(); - mCurrGeneration = newGeneration; -} - -already_AddRefed -gfxPangoFontGroup::MakeFontSet(PangoLanguage *aLang, gfxFloat aSizeAdjustFactor, - nsAutoRef *aMatchPattern) -{ - const char *lang = pango_language_to_string(aLang); - - RefPtr langGroup; - if (aLang != mPangoLanguage) { - // Set up langGroup for Mozilla's font prefs. - langGroup = NS_Atomize(lang); - } - - AutoTArray fcFamilyList; - EnumerateFontListPFG(langGroup ? langGroup.get() : mStyle.language.get(), - &fcFamilyList); - - // To consider: A fontset cache here could be helpful. - - // Get a pattern suitable for matching. - nsAutoRef pattern - (gfxFontconfigUtils::NewPattern(fcFamilyList, mStyle, lang)); - - PrepareSortPattern(pattern, mStyle.size, aSizeAdjustFactor, mStyle.printerFont); - - RefPtr fontset = - new gfxFcFontSet(pattern, mUserFontSet); - - mSkipDrawing = fontset->WaitingForUserFont(); - - if (aMatchPattern) - aMatchPattern->steal(pattern); - - return fontset.forget(); -} - -gfxPangoFontGroup:: -FontSetByLangEntry::FontSetByLangEntry(PangoLanguage *aLang, - gfxFcFontSet *aFontSet) - : mLang(aLang), mFontSet(aFontSet) -{ -} - -gfxFcFontSet * -gfxPangoFontGroup::GetFontSet(PangoLanguage *aLang) -{ - GetBaseFontSet(); // sets mSizeAdjustFactor and mFontSets[0] - - if (!aLang) - return mFontSets[0].mFontSet; - - for (uint32_t i = 0; i < mFontSets.Length(); ++i) { - if (mFontSets[i].mLang == aLang) - return mFontSets[i].mFontSet; - } - - RefPtr fontSet = - MakeFontSet(aLang, mSizeAdjustFactor); - mFontSets.AppendElement(FontSetByLangEntry(aLang, fontSet)); - - return fontSet; -} - -already_AddRefed -gfxPangoFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, - uint32_t aNextCh, Script aRunScript, - gfxFont *aPrevMatchedFont, - uint8_t *aMatchType) -{ - if (aPrevMatchedFont) { - // Don't switch fonts for control characters, regardless of - // whether they are present in the current font, as they won't - // actually be rendered (see bug 716229) - uint8_t category = GetGeneralCategory(aCh); - if (category == HB_UNICODE_GENERAL_CATEGORY_CONTROL) { - return RefPtr(aPrevMatchedFont).forget(); - } - - // if this character is a join-control or the previous is a join-causer, - // use the same font as the previous range if we can - if (gfxFontUtils::IsJoinControl(aCh) || - gfxFontUtils::IsJoinCauser(aPrevCh)) { - if (aPrevMatchedFont->HasCharacter(aCh)) { - return RefPtr(aPrevMatchedFont).forget(); - } - } - } - - // if this character is a variation selector, - // use the previous font regardless of whether it supports VS or not. - // otherwise the text run will be divided. - if (gfxFontUtils::IsVarSelector(aCh)) { - if (aPrevMatchedFont) { - return RefPtr(aPrevMatchedFont).forget(); - } - // VS alone. it's meaningless to search different fonts - return nullptr; - } - - // The real fonts that fontconfig provides for generic/fallback families - // depend on the language used, so a different FontSet is used for each - // language (except for the variation below). - // - // With most fontconfig configurations any real family names prior to a - // fontconfig generic with corresponding fonts installed will still lead - // to the same leading fonts in each FontSet. - // - // There is an inefficiency here therefore because the same base FontSet - // could often be used if these real families support the character. - // However, with fontconfig aliases, it is difficult to distinguish - // where exactly alias fonts end and generic/fallback fonts begin. - // - // The variation from pure language-based matching used here is that the - // same primary/base font is always used irrespective of the language. - // This provides that SCRIPT_COMMON characters are consistently rendered - // with the same font (bug 339513 and bug 416725). This is particularly - // important with the word cache as script can't be reliably determined - // from surrounding words. It also often avoids the unnecessary extra - // FontSet efficiency mentioned above. - // - // However, in two situations, the base font is not checked before the - // language-specific FontSet. - // - // 1. When we don't have a language to make a good choice for - // the base font. - // - // 2. For system fonts, use the default Pango behavior to give - // consistency with other apps. This is relevant when un-localized - // builds are run in non-Latin locales. This special-case probably - // wouldn't be necessary but for bug 91190. - - gfxFcFontSet *fontSet = GetBaseFontSet(); - uint32_t nextFont = 0; - FcPattern *basePattern = nullptr; - if (!mStyle.systemFont && mPangoLanguage) { - basePattern = fontSet->GetFontPatternAt(0); - if (HasChar(basePattern, aCh)) { - *aMatchType = gfxTextRange::kFontGroup; - return RefPtr(GetBaseFont()).forget(); - } - - nextFont = 1; - } - - // Our MOZ_SCRIPT_* codes may not match the PangoScript enumeration values - // (if we're using ICU's codes), so convert by mapping through ISO 15924 tag. - // Note that PangoScript is defined to be compatible with GUnicodeScript: - // https://developer.gnome.org/pango/stable/pango-Scripts-and-Languages.html#PangoScript - const hb_tag_t scriptTag = GetScriptTagForCode(aRunScript); - const PangoScript script = - (const PangoScript)hb_glib_script_from_script(hb_script_from_iso15924_tag(scriptTag)); - - // Might be nice to call pango_language_includes_script only once for the - // run rather than for each character. - PangoLanguage *scriptLang; - if ((!basePattern || - !pango_language_includes_script(mPangoLanguage, script)) && - (scriptLang = pango_script_get_sample_language(script))) { - fontSet = GetFontSet(scriptLang); - nextFont = 0; - } - - for (uint32_t i = nextFont; - FcPattern *pattern = fontSet->GetFontPatternAt(i); - ++i) { - if (pattern == basePattern) { - continue; // already checked basePattern - } - - if (HasChar(pattern, aCh)) { - *aMatchType = gfxTextRange::kFontGroup; - return RefPtr(fontSet->GetFontAt(i, GetStyle())).forget(); - } - } - - return nullptr; -} - -/** - ** gfxFcFont - **/ - -cairo_user_data_key_t gfxFcFont::sGfxFontKey; - -gfxFcFont::gfxFcFont(cairo_scaled_font_t *aCairoFont, - FcPattern *aPattern, - gfxFcFontEntry *aFontEntry, - const gfxFontStyle *aFontStyle) - : gfxFontconfigFontBase(aCairoFont, aPattern, aFontEntry, aFontStyle) -{ - cairo_scaled_font_set_user_data(mScaledFont, &sGfxFontKey, this, nullptr); -} - -gfxFcFont::~gfxFcFont() -{ - cairo_scaled_font_set_user_data(mScaledFont, - &sGfxFontKey, - nullptr, - nullptr); -} - -already_AddRefed -gfxFcFont::GetSubSuperscriptFont(int32_t aAppUnitsPerDevPixel) -{ - gfxFontStyle style(*GetStyle()); - style.AdjustForSubSuperscript(aAppUnitsPerDevPixel); - return MakeScaledFont(&style, style.size / GetStyle()->size); -} - -already_AddRefed -gfxFcFont::MakeScaledFont(gfxFontStyle *aFontStyle, gfxFloat aScaleFactor) -{ - gfxFcFontEntry* fe = static_cast(GetFontEntry()); - RefPtr font = - gfxFontCache::GetCache()->Lookup(fe, aFontStyle, nullptr); - if (font) { - return font.forget(); - } - - cairo_matrix_t fontMatrix; - cairo_scaled_font_get_font_matrix(mScaledFont, &fontMatrix); - cairo_matrix_scale(&fontMatrix, aScaleFactor, aScaleFactor); - - cairo_matrix_t ctm; - cairo_scaled_font_get_ctm(mScaledFont, &ctm); - - cairo_font_options_t *options = cairo_font_options_create(); - cairo_scaled_font_get_font_options(mScaledFont, options); - - cairo_scaled_font_t *newFont = - cairo_scaled_font_create(cairo_scaled_font_get_font_face(mScaledFont), - &fontMatrix, &ctm, options); - cairo_font_options_destroy(options); - - font = new gfxFcFont(newFont, GetPattern(), fe, aFontStyle); - gfxFontCache::GetCache()->AddNew(font); - cairo_scaled_font_destroy(newFont); - - return font.forget(); -} - -already_AddRefed -gfxFcFont::GetSmallCapsFont() -{ - gfxFontStyle style(*GetStyle()); - style.size *= SMALL_CAPS_SCALE_FACTOR; - style.variantCaps = NS_FONT_VARIANT_CAPS_NORMAL; - return MakeScaledFont(&style, SMALL_CAPS_SCALE_FACTOR); -} - -/* static */ void -gfxPangoFontGroup::Shutdown() -{ - // Resetting gFTLibrary in case this is wanted again after a - // cairo_debug_reset_static_data. - gFTLibrary = nullptr; -} - -/* static */ gfxFontEntry * -gfxPangoFontGroup::NewFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle) -{ - gfxFontconfigUtils *utils = gfxFontconfigUtils::GetFontconfigUtils(); - if (!utils) - return nullptr; - - // The font face name from @font-face { src: local() } is not well - // defined. - // - // On MS Windows, this name gets compared with - // ENUMLOGFONTEXW::elfFullName, which for OpenType fonts seems to be the - // full font name from the name table. For CFF OpenType fonts this is the - // same as the PostScript name, but for TrueType fonts it is usually - // different. - // - // On Mac, the font face name is compared with the PostScript name, even - // for TrueType fonts. - // - // Fontconfig only records the full font names, so the behavior here - // follows that on MS Windows. However, to provide the possibility - // of aliases to compensate for variations, the font face name is passed - // through FcConfigSubstitute. - - nsAutoRef pattern(FcPatternCreate()); - if (!pattern) - return nullptr; - - NS_ConvertUTF16toUTF8 fullname(aFontName); - FcPatternAddString(pattern, FC_FULLNAME, - gfxFontconfigUtils::ToFcChar8(fullname)); - FcConfigSubstitute(nullptr, pattern, FcMatchPattern); - - FcChar8 *name; - for (int v = 0; - FcPatternGetString(pattern, FC_FULLNAME, v, &name) == FcResultMatch; - ++v) { - const nsTArray< nsCountedRef >& fonts = - utils->GetFontsForFullname(name); - - if (fonts.Length() != 0) - return new gfxLocalFcFontEntry(aFontName, - aWeight, - aStretch, - aStyle, - fonts); - } - - return nullptr; -} - -/* static */ FT_Library -gfxPangoFontGroup::GetFTLibrary() -{ - if (!gFTLibrary) { - // Use cairo's FT_Library so that cairo takes care of shutdown of the - // FT_Library after it has destroyed its font_faces, and FT_Done_Face - // has been called on each FT_Face, at least until this bug is fixed: - // https://bugs.freedesktop.org/show_bug.cgi?id=18857 - // - // Cairo's FT_Library can be obtained from any cairo_scaled_font. The - // font properties requested here are chosen to get an FT_Face that is - // likely to be also used elsewhere. - gfxFontStyle style; - RefPtr fontGroup = - new gfxPangoFontGroup(FontFamilyList(eFamily_sans_serif), - &style, nullptr, 1.0); - - gfxFcFont *font = fontGroup->GetBaseFont(); - if (!font) - return nullptr; - - gfxFT2LockedFace face(font); - if (!face.get()) - return nullptr; - - gFTLibrary = face.get()->glyph->library; - } - - return gFTLibrary; -} - -/* static */ gfxFontEntry * -gfxPangoFontGroup::NewFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle, - const uint8_t* aFontData, - uint32_t aLength) -{ - // Ownership of aFontData is passed in here, and transferred to the - // new fontEntry, which will release it when no longer needed. - - // Using face_index = 0 for the first face in the font, as we have no - // other information. FT_New_Memory_Face checks for a nullptr FT_Library. - FT_Face face; - FT_Error error = - FT_New_Memory_Face(GetFTLibrary(), aFontData, aLength, 0, &face); - if (error != 0) { - free((void*)aFontData); - return nullptr; - } - - return new gfxDownloadedFcFontEntry(aFontName, aWeight, - aStretch, aStyle, - aFontData, face); -} - - -static double -GetPixelSize(FcPattern *aPattern) -{ - double size; - if (FcPatternGetDouble(aPattern, - FC_PIXEL_SIZE, 0, &size) == FcResultMatch) - return size; - - NS_NOTREACHED("No size on pattern"); - return 0.0; -} - -/** - * The following gfxFcFonts are accessed from the cairo_scaled_font or created - * from the FcPattern, not from the gfxFontCache hash table. The gfxFontCache - * hash table is keyed by desired family and style, whereas here we only know - * actual family and style. There may be more than one of these fonts with - * the same family and style, but different PangoFont and actual font face. - * - * The point of this is to record the exact font face for gfxTextRun glyph - * indices. The style of this font does not necessarily represent the exact - * gfxFontStyle used to build the text run. Notably, the language is not - * recorded. - */ - -/* static */ -already_AddRefed -gfxFcFont::GetOrMakeFont(FcPattern *aRequestedPattern, FcPattern *aFontPattern, - const gfxFontStyle *aFontStyle) -{ - nsAutoRef renderPattern - (FcFontRenderPrepare(nullptr, aRequestedPattern, aFontPattern)); - - // If synthetic bold/italic is not allowed by the style, adjust the - // resulting pattern to match the actual properties of the font. - if (!aFontStyle->allowSyntheticWeight) { - int weight; - if (FcPatternGetInteger(aFontPattern, FC_WEIGHT, 0, - &weight) == FcResultMatch) { - FcPatternDel(renderPattern, FC_WEIGHT); - FcPatternAddInteger(renderPattern, FC_WEIGHT, weight); - } - } - if (!aFontStyle->allowSyntheticStyle) { - int slant; - if (FcPatternGetInteger(aFontPattern, FC_SLANT, 0, - &slant) == FcResultMatch) { - FcPatternDel(renderPattern, FC_SLANT); - FcPatternAddInteger(renderPattern, FC_SLANT, slant); - } - } - - cairo_font_face_t *face = - cairo_ft_font_face_create_for_pattern(renderPattern); - - // Reuse an existing font entry if available. - RefPtr fe = gfxFcFontEntry::LookupFontEntry(face); - if (!fe) { - gfxDownloadedFcFontEntry *downloadedFontEntry = - GetDownloadedFontEntry(aFontPattern); - if (downloadedFontEntry) { - // Web font - fe = downloadedFontEntry; - if (cairo_font_face_status(face) == CAIRO_STATUS_SUCCESS) { - // cairo_font_face_t is using the web font data. - // Hold a reference to the font entry to keep the font face - // data. - if (!downloadedFontEntry->SetCairoFace(face)) { - // OOM. Let cairo pick a fallback font - cairo_font_face_destroy(face); - face = cairo_ft_font_face_create_for_pattern(aRequestedPattern); - fe = gfxFcFontEntry::LookupFontEntry(face); - } - } - } - if (!fe) { - // Get a unique name for the font face from the file and id. - nsAutoString name; - FcChar8 *fc_file; - if (FcPatternGetString(renderPattern, - FC_FILE, 0, &fc_file) == FcResultMatch) { - int index; - if (FcPatternGetInteger(renderPattern, - FC_INDEX, 0, &index) != FcResultMatch) { - // cairo defaults to 0. - index = 0; - } - - AppendUTF8toUTF16(gfxFontconfigUtils::ToCString(fc_file), name); - if (index != 0) { - name.Append('/'); - name.AppendInt(index); - } - } - - fe = new gfxSystemFcFontEntry(face, aFontPattern, name); - } - } - - gfxFontStyle style(*aFontStyle); - style.size = GetPixelSize(renderPattern); - style.style = gfxFontconfigUtils::GetThebesStyle(renderPattern); - style.weight = gfxFontconfigUtils::GetThebesWeight(renderPattern); - - RefPtr font = - gfxFontCache::GetCache()->Lookup(fe, &style, nullptr); - if (!font) { - // Note that a file/index pair (or FT_Face) and the gfxFontStyle are - // not necessarily enough to provide a key that will describe a unique - // font. cairoFont contains information from renderPattern, which is a - // fully resolved pattern from FcFontRenderPrepare. - // FcFontRenderPrepare takes the requested pattern and the face - // pattern as input and can modify elements of the resulting pattern - // that affect rendering but are not included in the gfxFontStyle. - cairo_scaled_font_t *cairoFont = CreateScaledFont(renderPattern, face); - font = new gfxFcFont(cairoFont, renderPattern, fe, &style); - gfxFontCache::GetCache()->AddNew(font); - cairo_scaled_font_destroy(cairoFont); - } - - cairo_font_face_destroy(face); - - RefPtr retval(static_cast(font.get())); - return retval.forget(); -} - -gfxFcFontSet * -gfxPangoFontGroup::GetBaseFontSet() -{ - if (mFontSets.Length() > 0) - return mFontSets[0].mFontSet; - - mSizeAdjustFactor = 1.0; // will be adjusted below if necessary - nsAutoRef pattern; - RefPtr fontSet = - MakeFontSet(mPangoLanguage, mSizeAdjustFactor, &pattern); - - double size = GetPixelSize(pattern); - if (size != 0.0 && mStyle.sizeAdjust > 0.0) { - gfxFcFont *font = fontSet->GetFontAt(0, GetStyle()); - if (font) { - const gfxFont::Metrics& metrics = - font->GetMetrics(gfxFont::eHorizontal); // XXX vertical? - - // The factor of 0.1 ensures that xHeight is sane so fonts don't - // become huge. Strictly ">" ensures that xHeight and emHeight are - // not both zero. - if (metrics.xHeight > 0.1 * metrics.emHeight) { - mSizeAdjustFactor = - mStyle.sizeAdjust * metrics.emHeight / metrics.xHeight; - - size *= mSizeAdjustFactor; - FcPatternDel(pattern, FC_PIXEL_SIZE); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, size); - - fontSet = new gfxFcFontSet(pattern, mUserFontSet); - } - } - } - - PangoLanguage *pangoLang = mPangoLanguage; - FcChar8 *fcLang; - if (!pangoLang && - FcPatternGetString(pattern, FC_LANG, 0, &fcLang) == FcResultMatch) { - pangoLang = - pango_language_from_string(gfxFontconfigUtils::ToCString(fcLang)); - } - - mFontSets.AppendElement(FontSetByLangEntry(pangoLang, fontSet)); - - return fontSet; -} - -/** - ** gfxTextRun - * - * A serious problem: - * - * -- We draw with a font that's hinted for the CTM, but we measure with a font - * hinted to the identity matrix, so our "bounding metrics" may not be accurate. - * - **/ - -// This will fetch an existing scaled_font if one exists. -static cairo_scaled_font_t * -CreateScaledFont(FcPattern *aPattern, cairo_font_face_t *aFace) -{ - double size = GetPixelSize(aPattern); - - cairo_matrix_t fontMatrix; - FcMatrix *fcMatrix; - if (FcPatternGetMatrix(aPattern, FC_MATRIX, 0, &fcMatrix) == FcResultMatch) - cairo_matrix_init(&fontMatrix, fcMatrix->xx, -fcMatrix->yx, -fcMatrix->xy, fcMatrix->yy, 0, 0); - else - cairo_matrix_init_identity(&fontMatrix); - cairo_matrix_scale(&fontMatrix, size, size); - - FcBool printing; - if (FcPatternGetBool(aPattern, PRINTING_FC_PROPERTY, 0, &printing) != FcResultMatch) { - printing = FcFalse; - } - - // The cairo_scaled_font is created with a unit ctm so that metrics and - // positions are in user space, but this means that hinting effects will - // not be estimated accurately for non-unit transformations. - cairo_matrix_t identityMatrix; - cairo_matrix_init_identity(&identityMatrix); - - // Font options are set explicitly here to improve cairo's caching - // behavior and to record the relevant parts of the pattern for - // SetupCairoFont (so that the pattern can be released). - // - // Most font_options have already been set as defaults on the FcPattern - // with cairo_ft_font_options_substitute(), then user and system - // fontconfig configurations were applied. The resulting font_options - // have been recorded on the face during - // cairo_ft_font_face_create_for_pattern(). - // - // None of the settings here cause this scaled_font to behave any - // differently from how it would behave if it were created from the same - // face with default font_options. - // - // We set options explicitly so that the same scaled_font will be found in - // the cairo_scaled_font_map when cairo loads glyphs from a context with - // the same font_face, font_matrix, ctm, and surface font_options. - // - // Unfortunately, _cairo_scaled_font_keys_equal doesn't know about the - // font_options on the cairo_ft_font_face, and doesn't consider default - // option values to not match any explicit values. - // - // Even after cairo_set_scaled_font is used to set font_options for the - // cairo context, when cairo looks for a scaled_font for the context, it - // will look for a font with some option values from the target surface if - // any values are left default on the context font_options. If this - // scaled_font is created with default font_options, cairo will not find - // it. - cairo_font_options_t *fontOptions = cairo_font_options_create(); - - // The one option not recorded in the pattern is hint_metrics, which will - // affect glyph metrics. The default behaves as CAIRO_HINT_METRICS_ON. - // We should be considering the font_options of the surface on which this - // font will be used, but currently we don't have different gfxFonts for - // different surface font_options, so we'll create a font suitable for the - // Screen. Image and xlib surfaces default to CAIRO_HINT_METRICS_ON. - if (printing) { - cairo_font_options_set_hint_metrics(fontOptions, CAIRO_HINT_METRICS_OFF); - } else { - cairo_font_options_set_hint_metrics(fontOptions, CAIRO_HINT_METRICS_ON); - } - - // The remaining options have been recorded on the pattern and the face. - // _cairo_ft_options_merge has some logic to decide which options from the - // scaled_font or from the cairo_ft_font_face take priority in the way the - // font behaves. - // - // In the majority of cases, _cairo_ft_options_merge uses the options from - // the cairo_ft_font_face, so sometimes it is not so important which - // values are set here so long as they are not defaults, but we'll set - // them to the exact values that we expect from the font, to be consistent - // and to protect against changes in cairo. - // - // In some cases, _cairo_ft_options_merge uses some options from the - // scaled_font's font_options rather than options on the - // cairo_ft_font_face (from fontconfig). - // https://bugs.freedesktop.org/show_bug.cgi?id=11838 - // - // Surface font options were set on the pattern in - // cairo_ft_font_options_substitute. If fontconfig has changed the - // hint_style then that is what the user (or distribution) wants, so we - // use the setting from the FcPattern. - // - // Fallback values here mirror treatment of defaults in cairo-ft-font.c. - FcBool hinting = FcFalse; - if (FcPatternGetBool(aPattern, FC_HINTING, 0, &hinting) != FcResultMatch) { - hinting = FcTrue; - } - - cairo_hint_style_t hint_style; - if (printing || !hinting) { - hint_style = CAIRO_HINT_STYLE_NONE; - } else { -#ifdef FC_HINT_STYLE // FC_HINT_STYLE is available from fontconfig 2.2.91. - int fc_hintstyle; - if (FcPatternGetInteger(aPattern, FC_HINT_STYLE, - 0, &fc_hintstyle ) != FcResultMatch) { - fc_hintstyle = FC_HINT_FULL; - } - switch (fc_hintstyle) { - case FC_HINT_NONE: - hint_style = CAIRO_HINT_STYLE_NONE; - break; - case FC_HINT_SLIGHT: - hint_style = CAIRO_HINT_STYLE_SLIGHT; - break; - case FC_HINT_MEDIUM: - default: // This fallback mirrors _get_pattern_ft_options in cairo. - hint_style = CAIRO_HINT_STYLE_MEDIUM; - break; - case FC_HINT_FULL: - hint_style = CAIRO_HINT_STYLE_FULL; - break; - } -#else // no FC_HINT_STYLE - hint_style = CAIRO_HINT_STYLE_FULL; -#endif - } - cairo_font_options_set_hint_style(fontOptions, hint_style); - - int rgba; - if (FcPatternGetInteger(aPattern, - FC_RGBA, 0, &rgba) != FcResultMatch) { - rgba = FC_RGBA_UNKNOWN; - } - cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; - switch (rgba) { - case FC_RGBA_UNKNOWN: - case FC_RGBA_NONE: - default: - // There is no CAIRO_SUBPIXEL_ORDER_NONE. Subpixel antialiasing - // is disabled through cairo_antialias_t. - rgba = FC_RGBA_NONE; - // subpixel_order won't be used by the font as we won't use - // CAIRO_ANTIALIAS_SUBPIXEL, but don't leave it at default for - // caching reasons described above. Fall through: - MOZ_FALLTHROUGH; - case FC_RGBA_RGB: - subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB; - break; - case FC_RGBA_BGR: - subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR; - break; - case FC_RGBA_VRGB: - subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB; - break; - case FC_RGBA_VBGR: - subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR; - break; - } - cairo_font_options_set_subpixel_order(fontOptions, subpixel_order); - - FcBool fc_antialias; - if (FcPatternGetBool(aPattern, - FC_ANTIALIAS, 0, &fc_antialias) != FcResultMatch) { - fc_antialias = FcTrue; - } - cairo_antialias_t antialias; - if (!fc_antialias) { - antialias = CAIRO_ANTIALIAS_NONE; - } else if (rgba == FC_RGBA_NONE) { - antialias = CAIRO_ANTIALIAS_GRAY; - } else { - antialias = CAIRO_ANTIALIAS_SUBPIXEL; - } - cairo_font_options_set_antialias(fontOptions, antialias); - - cairo_scaled_font_t *scaledFont = - cairo_scaled_font_create(aFace, &fontMatrix, &identityMatrix, - fontOptions); - - cairo_font_options_destroy(fontOptions); - - NS_ASSERTION(cairo_scaled_font_status(scaledFont) == CAIRO_STATUS_SUCCESS, - "Failed to create scaled font"); - return scaledFont; -} - -/* static */ -PangoLanguage * -GuessPangoLanguage(nsIAtom *aLanguage) -{ - if (!aLanguage) - return nullptr; - - // Pango and fontconfig won't understand mozilla's internal langGroups, so - // find a real language. - nsAutoCString lang; - gfxFontconfigUtils::GetSampleLangForGroup(aLanguage, &lang); - if (lang.IsEmpty()) - return nullptr; - - return pango_language_from_string(lang.get()); -} - -#ifdef MOZ_WIDGET_GTK -/*************************************************************************** - * - * This function must be last in the file because it uses the system cairo - * library. Above this point the cairo library used is the tree cairo if - * MOZ_TREE_CAIRO. - */ - -#if MOZ_TREE_CAIRO -// Tree cairo symbols have different names. Disable their activation through -// preprocessor macros. -#undef cairo_ft_font_options_substitute - -// The system cairo functions are not declared because the include paths cause -// the gdk headers to pick up the tree cairo.h. -extern "C" { -NS_VISIBILITY_DEFAULT void -cairo_ft_font_options_substitute (const cairo_font_options_t *options, - FcPattern *pattern); -} -#endif - -static void -ApplyGdkScreenFontOptions(FcPattern *aPattern) -{ - const cairo_font_options_t *options = - gdk_screen_get_font_options(gdk_screen_get_default()); - - cairo_ft_font_options_substitute(options, aPattern); -} - -#endif // MOZ_WIDGET_GTK - diff --git a/gfx/thebes/gfxFontconfigFonts.h b/gfx/thebes/gfxFontconfigFonts.h index cd59cfc68c62d..09bf51c6e98b3 100644 --- a/gfx/thebes/gfxFontconfigFonts.h +++ b/gfx/thebes/gfxFontconfigFonts.h @@ -21,103 +21,4 @@ typedef struct _FcPattern FcPattern; typedef struct FT_FaceRec_* FT_Face; typedef struct FT_LibraryRec_ *FT_Library; -class gfxPangoFontGroup : public gfxFontGroup { -public: - gfxPangoFontGroup(const mozilla::FontFamilyList& aFontFamilyList, - const gfxFontStyle *aStyle, - gfxUserFontSet *aUserFontSet, - gfxFloat aDevToCssSize); - virtual ~gfxPangoFontGroup(); - - virtual gfxFontGroup *Copy(const gfxFontStyle *aStyle); - - virtual gfxFont* GetFirstValidFont(uint32_t aCh = 0x20); - - virtual void UpdateUserFonts(); - - virtual already_AddRefed - FindFontForChar(uint32_t aCh, uint32_t aPrevCh, uint32_t aNextCh, - Script aRunScript, gfxFont *aPrevMatchedFont, - uint8_t *aMatchType); - - static void Shutdown(); - - // Used for @font-face { src: local(); } - static gfxFontEntry *NewFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle); - // Used for @font-face { src: url(); } - static gfxFontEntry *NewFontEntry(const nsAString& aFontName, - uint16_t aWeight, - int16_t aStretch, - uint8_t aStyle, - const uint8_t* aFontData, - uint32_t aLength); - - static FT_Library GetFTLibrary(); - -private: - - virtual gfxFont *GetFontAt(int32_t i, uint32_t aCh = 0x20); - - // @param aLang [in] language to use for pref fonts and system default font - // selection, or nullptr for the language guessed from the - // gfxFontStyle. - // The FontGroup holds a reference to this set. - gfxFcFontSet *GetFontSet(PangoLanguage *aLang = nullptr); - - class FontSetByLangEntry { - public: - FontSetByLangEntry(PangoLanguage *aLang, gfxFcFontSet *aFontSet); - PangoLanguage *mLang; - RefPtr mFontSet; - }; - // There is only one of entry in this array unless characters from scripts - // of other languages are measured. - AutoTArray mFontSets; - - gfxFloat mSizeAdjustFactor; - PangoLanguage *mPangoLanguage; - - // @param aLang [in] language to use for pref fonts and system font - // resolution, or nullptr to guess a language from the gfxFontStyle. - // @param aMatchPattern [out] if non-nullptr, will return the pattern used. - already_AddRefed - MakeFontSet(PangoLanguage *aLang, gfxFloat aSizeAdjustFactor, - nsAutoRef *aMatchPattern = nullptr); - - gfxFcFontSet *GetBaseFontSet(); - gfxFcFont *GetBaseFont(); - - gfxFloat GetSizeAdjustFactor() - { - if (mFontSets.Length() == 0) - GetBaseFontSet(); - return mSizeAdjustFactor; - } - - // old helper methods from gfxFontGroup, moved here so that those methods - // can be revamped without affecting the legacy code here - - // iterate over the fontlist, lookup names and expand generics - void EnumerateFontListPFG(nsIAtom *aLanguage, void *aClosure); - - // expand a generic to a list of specific names based on prefs - void FindGenericFontsPFG(mozilla::FontFamilyType aGenericType, - nsIAtom *aLanguage, - void *aClosure); - - // lookup and add a font with a given name (i.e. *not* a generic!) - void FindPlatformFontPFG(const nsAString& aName, - bool aUseFontSet, - void *aClosure); - - static void - ResolveGenericFontNamesPFG(mozilla::FontFamilyType aGenericType, - nsIAtom *aLanguage, - nsTArray& aGenericFamilies); - -}; - #endif /* GFX_FONTCONFIG_FONTS_H */ diff --git a/gfx/thebes/gfxFontconfigUtils.cpp b/gfx/thebes/gfxFontconfigUtils.cpp deleted file mode 100644 index 5bf606c13e255..0000000000000 --- a/gfx/thebes/gfxFontconfigUtils.cpp +++ /dev/null @@ -1,1100 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "mozilla/ArrayUtils.h" - -#include "gfxFontconfigUtils.h" -#include "gfxFont.h" -#include "nsGkAtoms.h" - -#include -#include - -#include "nsServiceManagerUtils.h" -#include "nsILanguageAtomService.h" -#include "nsTArray.h" -#include "mozilla/Preferences.h" -#include "nsDirectoryServiceUtils.h" -#include "nsDirectoryServiceDefs.h" -#include "nsAppDirectoryServiceDefs.h" - -#include "nsIAtom.h" -#include "nsCRT.h" -#include "gfxFontConstants.h" -#include "mozilla/gfx/2D.h" - -using namespace mozilla; - -/* static */ gfxFontconfigUtils* gfxFontconfigUtils::sUtils = nullptr; -static nsILanguageAtomService* gLangService = nullptr; - -/* static */ void -gfxFontconfigUtils::Shutdown() { - if (sUtils) { - delete sUtils; - sUtils = nullptr; - } - NS_IF_RELEASE(gLangService); -} - -/* static */ uint8_t -gfxFontconfigUtils::FcSlantToThebesStyle(int aFcSlant) -{ - switch (aFcSlant) { - case FC_SLANT_ITALIC: - return NS_FONT_STYLE_ITALIC; - case FC_SLANT_OBLIQUE: - return NS_FONT_STYLE_OBLIQUE; - default: - return NS_FONT_STYLE_NORMAL; - } -} - -/* static */ uint8_t -gfxFontconfigUtils::GetThebesStyle(FcPattern *aPattern) -{ - int slant; - if (FcPatternGetInteger(aPattern, FC_SLANT, 0, &slant) != FcResultMatch) { - return NS_FONT_STYLE_NORMAL; - } - - return FcSlantToThebesStyle(slant); -} - -/* static */ int -gfxFontconfigUtils::GetFcSlant(const gfxFontStyle& aFontStyle) -{ - if (aFontStyle.style == NS_FONT_STYLE_ITALIC) - return FC_SLANT_ITALIC; - if (aFontStyle.style == NS_FONT_STYLE_OBLIQUE) - return FC_SLANT_OBLIQUE; - - return FC_SLANT_ROMAN; -} - -// OS/2 weight classes were introduced in fontconfig-2.1.93 (2003). -#ifndef FC_WEIGHT_THIN -#define FC_WEIGHT_THIN 0 // 2.1.93 -#define FC_WEIGHT_EXTRALIGHT 40 // 2.1.93 -#define FC_WEIGHT_REGULAR 80 // 2.1.93 -#define FC_WEIGHT_EXTRABOLD 205 // 2.1.93 -#endif -// book was introduced in fontconfig-2.2.90 (and so fontconfig-2.3.0 in 2005) -#ifndef FC_WEIGHT_BOOK -#define FC_WEIGHT_BOOK 75 -#endif -// extra black was introduced in fontconfig-2.4.91 (2007) -#ifndef FC_WEIGHT_EXTRABLACK -#define FC_WEIGHT_EXTRABLACK 215 -#endif - -/* static */ uint16_t -gfxFontconfigUtils::GetThebesWeight(FcPattern *aPattern) -{ - int weight; - if (FcPatternGetInteger(aPattern, FC_WEIGHT, 0, &weight) != FcResultMatch) - return NS_FONT_WEIGHT_NORMAL; - - if (weight <= (FC_WEIGHT_THIN + FC_WEIGHT_EXTRALIGHT) / 2) - return 100; - if (weight <= (FC_WEIGHT_EXTRALIGHT + FC_WEIGHT_LIGHT) / 2) - return 200; - if (weight <= (FC_WEIGHT_LIGHT + FC_WEIGHT_BOOK) / 2) - return 300; - if (weight <= (FC_WEIGHT_REGULAR + FC_WEIGHT_MEDIUM) / 2) - // This includes FC_WEIGHT_BOOK - return 400; - if (weight <= (FC_WEIGHT_MEDIUM + FC_WEIGHT_DEMIBOLD) / 2) - return 500; - if (weight <= (FC_WEIGHT_DEMIBOLD + FC_WEIGHT_BOLD) / 2) - return 600; - if (weight <= (FC_WEIGHT_BOLD + FC_WEIGHT_EXTRABOLD) / 2) - return 700; - if (weight <= (FC_WEIGHT_EXTRABOLD + FC_WEIGHT_BLACK) / 2) - return 800; - if (weight <= FC_WEIGHT_BLACK) - return 900; - - // including FC_WEIGHT_EXTRABLACK - return 901; -} - -/* static */ int -gfxFontconfigUtils::FcWeightForBaseWeight(int8_t aBaseWeight) -{ - NS_PRECONDITION(aBaseWeight >= 0 && aBaseWeight <= 10, - "base weight out of range"); - - switch (aBaseWeight) { - case 2: - return FC_WEIGHT_EXTRALIGHT; - case 3: - return FC_WEIGHT_LIGHT; - case 4: - return FC_WEIGHT_REGULAR; - case 5: - return FC_WEIGHT_MEDIUM; - case 6: - return FC_WEIGHT_DEMIBOLD; - case 7: - return FC_WEIGHT_BOLD; - case 8: - return FC_WEIGHT_EXTRABOLD; - case 9: - return FC_WEIGHT_BLACK; - } - - // extremes - return aBaseWeight < 2 ? FC_WEIGHT_THIN : FC_WEIGHT_EXTRABLACK; -} - -/* static */ int16_t -gfxFontconfigUtils::GetThebesStretch(FcPattern *aPattern) -{ - int width; - if (FcPatternGetInteger(aPattern, FC_WIDTH, 0, &width) != FcResultMatch) { - return NS_FONT_STRETCH_NORMAL; - } - - if (width <= (FC_WIDTH_ULTRACONDENSED + FC_WIDTH_EXTRACONDENSED) / 2) { - return NS_FONT_STRETCH_ULTRA_CONDENSED; - } - if (width <= (FC_WIDTH_EXTRACONDENSED + FC_WIDTH_CONDENSED) / 2) { - return NS_FONT_STRETCH_EXTRA_CONDENSED; - } - if (width <= (FC_WIDTH_CONDENSED + FC_WIDTH_SEMICONDENSED) / 2) { - return NS_FONT_STRETCH_CONDENSED; - } - if (width <= (FC_WIDTH_SEMICONDENSED + FC_WIDTH_NORMAL) / 2) { - return NS_FONT_STRETCH_SEMI_CONDENSED; - } - if (width <= (FC_WIDTH_NORMAL + FC_WIDTH_SEMIEXPANDED) / 2) { - return NS_FONT_STRETCH_NORMAL; - } - if (width <= (FC_WIDTH_SEMIEXPANDED + FC_WIDTH_EXPANDED) / 2) { - return NS_FONT_STRETCH_SEMI_EXPANDED; - } - if (width <= (FC_WIDTH_EXPANDED + FC_WIDTH_EXTRAEXPANDED) / 2) { - return NS_FONT_STRETCH_EXPANDED; - } - if (width <= (FC_WIDTH_EXTRAEXPANDED + FC_WIDTH_ULTRAEXPANDED) / 2) { - return NS_FONT_STRETCH_EXTRA_EXPANDED; - } - return NS_FONT_STRETCH_ULTRA_EXPANDED; -} - -/* static */ int -gfxFontconfigUtils::FcWidthForThebesStretch(int16_t aStretch) -{ - switch (aStretch) { - default: // this will catch "normal" (0) as well as out-of-range values - return FC_WIDTH_NORMAL; - case NS_FONT_STRETCH_ULTRA_CONDENSED: - return FC_WIDTH_ULTRACONDENSED; - case NS_FONT_STRETCH_EXTRA_CONDENSED: - return FC_WIDTH_EXTRACONDENSED; - case NS_FONT_STRETCH_CONDENSED: - return FC_WIDTH_CONDENSED; - case NS_FONT_STRETCH_SEMI_CONDENSED: - return FC_WIDTH_SEMICONDENSED; - case NS_FONT_STRETCH_SEMI_EXPANDED: - return FC_WIDTH_SEMIEXPANDED; - case NS_FONT_STRETCH_EXPANDED: - return FC_WIDTH_EXPANDED; - case NS_FONT_STRETCH_EXTRA_EXPANDED: - return FC_WIDTH_EXTRAEXPANDED; - case NS_FONT_STRETCH_ULTRA_EXPANDED: - return FC_WIDTH_ULTRAEXPANDED; - } -} - -// This makes a guess at an FC_WEIGHT corresponding to a base weight and -// offset (without any knowledge of which weights are available). - -/* static */ int -GuessFcWeight(const gfxFontStyle& aFontStyle) -{ - /* - * weights come in two parts crammed into one - * integer -- the "base" weight is weight / 100, - * the rest of the value is the "offset" from that - * weight -- the number of steps to move to adjust - * the weight in the list of supported font weights, - * this value can be negative or positive. - */ - int8_t weight = aFontStyle.ComputeWeight(); - - // ComputeWeight trimmed the range of weights for us - NS_ASSERTION(weight >= 0 && weight <= 10, - "base weight out of range"); - - return gfxFontconfigUtils::FcWeightForBaseWeight(weight); -} - -static void -AddString(FcPattern *aPattern, const char *object, const char *aString) -{ - FcPatternAddString(aPattern, object, - gfxFontconfigUtils::ToFcChar8(aString)); -} - -static void -AddWeakString(FcPattern *aPattern, const char *object, const char *aString) -{ - FcValue value; - value.type = FcTypeString; - value.u.s = gfxFontconfigUtils::ToFcChar8(aString); - - FcPatternAddWeak(aPattern, object, value, FcTrue); -} - -static void -AddLangGroup(FcPattern *aPattern, nsIAtom *aLangGroup) -{ - // Translate from mozilla's internal mapping into fontconfig's - nsAutoCString lang; - gfxFontconfigUtils::GetSampleLangForGroup(aLangGroup, &lang); - - if (!lang.IsEmpty()) { - AddString(aPattern, FC_LANG, lang.get()); - } -} - -nsReturnRef -gfxFontconfigUtils::NewPattern(const nsTArray& aFamilies, - const gfxFontStyle& aFontStyle, - const char *aLang) -{ - static const char* sFontconfigGenerics[] = - { "sans-serif", "serif", "monospace", "fantasy", "cursive" }; - - nsAutoRef pattern(FcPatternCreate()); - if (!pattern) - return nsReturnRef(); - - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, aFontStyle.size); - FcPatternAddInteger(pattern, FC_SLANT, GetFcSlant(aFontStyle)); - FcPatternAddInteger(pattern, FC_WEIGHT, GuessFcWeight(aFontStyle)); - FcPatternAddInteger(pattern, FC_WIDTH, FcWidthForThebesStretch(aFontStyle.stretch)); - - if (aLang) { - AddString(pattern, FC_LANG, aLang); - } - - bool useWeakBinding = false; - for (uint32_t i = 0; i < aFamilies.Length(); ++i) { - NS_ConvertUTF16toUTF8 family(aFamilies[i]); - if (!useWeakBinding) { - AddString(pattern, FC_FAMILY, family.get()); - - // fontconfig generic families are typically implemented with weak - // aliases (so that the preferred font depends on language). - // However, this would give them lower priority than subsequent - // non-generic families in the list. To ensure that subsequent - // families do not have a higher priority, they are given weak - // bindings. - for (uint32_t g = 0; - g < ArrayLength(sFontconfigGenerics); - ++g) { - if (0 == FcStrCmpIgnoreCase(ToFcChar8(sFontconfigGenerics[g]), - ToFcChar8(family.get()))) { - useWeakBinding = true; - break; - } - } - } else { - AddWeakString(pattern, FC_FAMILY, family.get()); - } - } - - return pattern.out(); -} - -gfxFontconfigUtils::gfxFontconfigUtils() - : mFontsByFamily(32) - , mFontsByFullname(32) - , mLangSupportTable(32) - , mLastConfig(nullptr) -#ifdef MOZ_BUNDLED_FONTS - , mBundledFontsInitialized(false) -#endif -{ - UpdateFontListInternal(); -} - -nsresult -gfxFontconfigUtils::GetFontList(nsIAtom *aLangGroup, - const nsACString& aGenericFamily, - nsTArray& aListOfFonts) -{ - aListOfFonts.Clear(); - - nsTArray fonts; - nsresult rv = GetFontListInternal(fonts, aLangGroup); - if (NS_FAILED(rv)) - return rv; - - for (uint32_t i = 0; i < fonts.Length(); ++i) { - aListOfFonts.AppendElement(NS_ConvertUTF8toUTF16(fonts[i])); - } - - aListOfFonts.Sort(); - - int32_t serif = 0, sansSerif = 0, monospace = 0; - - // Fontconfig supports 3 generic fonts, "serif", "sans-serif", and - // "monospace", slightly different from CSS's 5. - if (aGenericFamily.IsEmpty()) - serif = sansSerif = monospace = 1; - else if (aGenericFamily.LowerCaseEqualsLiteral("serif")) - serif = 1; - else if (aGenericFamily.LowerCaseEqualsLiteral("sans-serif")) - sansSerif = 1; - else if (aGenericFamily.LowerCaseEqualsLiteral("monospace")) - monospace = 1; - else if (aGenericFamily.LowerCaseEqualsLiteral("cursive") || - aGenericFamily.LowerCaseEqualsLiteral("fantasy")) - serif = sansSerif = 1; - else - NS_NOTREACHED("unexpected CSS generic font family"); - - // The first in the list becomes the default in - // FontBuilder.readFontSelection() if the preference-selected font is not - // available, so put system configured defaults first. - if (monospace) - aListOfFonts.InsertElementAt(0, NS_LITERAL_STRING("monospace")); - if (sansSerif) - aListOfFonts.InsertElementAt(0, NS_LITERAL_STRING("sans-serif")); - if (serif) - aListOfFonts.InsertElementAt(0, NS_LITERAL_STRING("serif")); - - return NS_OK; -} - -struct MozLangGroupData { - nsIAtom* const& mozLangGroup; - const char *defaultLang; -}; - -const MozLangGroupData MozLangGroups[] = { - { nsGkAtoms::x_western, "en" }, - { nsGkAtoms::x_cyrillic, "ru" }, - { nsGkAtoms::x_devanagari, "hi" }, - { nsGkAtoms::x_tamil, "ta" }, - { nsGkAtoms::x_armn, "hy" }, - { nsGkAtoms::x_beng, "bn" }, - { nsGkAtoms::x_cans, "iu" }, - { nsGkAtoms::x_ethi, "am" }, - { nsGkAtoms::x_geor, "ka" }, - { nsGkAtoms::x_gujr, "gu" }, - { nsGkAtoms::x_guru, "pa" }, - { nsGkAtoms::x_khmr, "km" }, - { nsGkAtoms::x_knda, "kn" }, - { nsGkAtoms::x_mlym, "ml" }, - { nsGkAtoms::x_orya, "or" }, - { nsGkAtoms::x_sinh, "si" }, - { nsGkAtoms::x_telu, "te" }, - { nsGkAtoms::x_tibt, "bo" }, - { nsGkAtoms::Unicode, 0 }, -}; - -static bool -TryLangForGroup(const nsACString& aOSLang, nsIAtom *aLangGroup, - nsACString *aFcLang) -{ - // Truncate at '.' or '@' from aOSLang, and convert '_' to '-'. - // aOSLang is in the form "language[_territory][.codeset][@modifier]". - // fontconfig takes languages in the form "language-territory". - // nsILanguageAtomService takes languages in the form language-subtag, - // where subtag may be a territory. fontconfig and nsILanguageAtomService - // handle case-conversion for us. - const char *pos, *end; - aOSLang.BeginReading(pos); - aOSLang.EndReading(end); - aFcLang->Truncate(); - while (pos < end) { - switch (*pos) { - case '.': - case '@': - end = pos; - break; - case '_': - aFcLang->Append('-'); - break; - default: - aFcLang->Append(*pos); - } - ++pos; - } - - nsIAtom *atom = - gLangService->LookupLanguage(*aFcLang); - - return atom == aLangGroup; -} - -/* static */ void -gfxFontconfigUtils::GetSampleLangForGroup(nsIAtom *aLangGroup, - nsACString *aFcLang) -{ - NS_PRECONDITION(aFcLang != nullptr, "aFcLang must not be NULL"); - - const MozLangGroupData *langGroup = nullptr; - - for (unsigned int i = 0; i < ArrayLength(MozLangGroups); ++i) { - if (aLangGroup == MozLangGroups[i].mozLangGroup) { - langGroup = &MozLangGroups[i]; - break; - } - } - - if (!langGroup) { - // Not a special mozilla language group. - // Use aLangGroup as a language code. - aLangGroup->ToUTF8String(*aFcLang); - return; - } - - // Check the environment for the users preferred language that corresponds - // to this langGroup. - if (!gLangService) { - CallGetService(NS_LANGUAGEATOMSERVICE_CONTRACTID, &gLangService); - } - - if (gLangService) { - const char *languages = getenv("LANGUAGE"); - if (languages) { - const char separator = ':'; - - for (const char *pos = languages; true; ++pos) { - if (*pos == '\0' || *pos == separator) { - if (languages < pos && - TryLangForGroup(Substring(languages, pos), - aLangGroup, aFcLang)) - return; - - if (*pos == '\0') - break; - - languages = pos + 1; - } - } - } - const char *ctype = setlocale(LC_CTYPE, nullptr); - if (ctype && - TryLangForGroup(nsDependentCString(ctype), aLangGroup, aFcLang)) - return; - } - - if (langGroup->defaultLang) { - aFcLang->Assign(langGroup->defaultLang); - } else { - aFcLang->Truncate(); - } -} - -nsresult -gfxFontconfigUtils::GetFontListInternal(nsTArray& aListOfFonts, - nsIAtom *aLangGroup) -{ - FcPattern *pat = nullptr; - FcObjectSet *os = nullptr; - FcFontSet *fs = nullptr; - nsresult rv = NS_ERROR_FAILURE; - - aListOfFonts.Clear(); - - pat = FcPatternCreate(); - if (!pat) - goto end; - - os = FcObjectSetBuild(FC_FAMILY, nullptr); - if (!os) - goto end; - - // take the pattern and add the lang group to it - if (aLangGroup) { - AddLangGroup(pat, aLangGroup); - } - - fs = FcFontList(nullptr, pat, os); - if (!fs) - goto end; - - for (int i = 0; i < fs->nfont; i++) { - char *family; - - if (FcPatternGetString(fs->fonts[i], FC_FAMILY, 0, - (FcChar8 **) &family) != FcResultMatch) - { - continue; - } - - // Remove duplicates... - nsAutoCString strFamily(family); - if (aListOfFonts.Contains(strFamily)) - continue; - - aListOfFonts.AppendElement(strFamily); - } - - rv = NS_OK; - - end: - if (NS_FAILED(rv)) - aListOfFonts.Clear(); - - if (pat) - FcPatternDestroy(pat); - if (os) - FcObjectSetDestroy(os); - if (fs) - FcFontSetDestroy(fs); - - return rv; -} - -nsresult -gfxFontconfigUtils::UpdateFontList() -{ - return UpdateFontListInternal(true); -} - -nsresult -gfxFontconfigUtils::UpdateFontListInternal(bool aForce) -{ - if (!aForce) { - // This checks periodically according to fontconfig's configured - // interval. - FcInitBringUptoDate(); - } else if (!FcConfigUptoDate(nullptr)) { // check now with aForce - mLastConfig = nullptr; - FcInitReinitialize(); - } - - // FcInitReinitialize() (used by FcInitBringUptoDate) creates a new config - // before destroying the old config, so the only way that we'd miss an - // update is if fontconfig did more than one update and the memory for the - // most recent config happened to be at the same location as the original - // config. - FcConfig *currentConfig = FcConfigGetCurrent(); - if (currentConfig == mLastConfig) - return NS_OK; - -#ifdef MOZ_BUNDLED_FONTS - ActivateBundledFonts(); -#endif - - // These FcFontSets are owned by fontconfig - FcFontSet *fontSets[] = { - FcConfigGetFonts(currentConfig, FcSetSystem) -#ifdef MOZ_BUNDLED_FONTS - , FcConfigGetFonts(currentConfig, FcSetApplication) -#endif - }; - - mFontsByFamily.Clear(); - mFontsByFullname.Clear(); - mLangSupportTable.Clear(); - - // Record the existing font families - for (unsigned fs = 0; fs < ArrayLength(fontSets); ++fs) { - FcFontSet *fontSet = fontSets[fs]; - if (!fontSet) { // the application set might not exist - continue; - } - for (int f = 0; f < fontSet->nfont; ++f) { - FcPattern *font = fontSet->fonts[f]; - - FcChar8 *family; - for (int v = 0; - FcPatternGetString(font, FC_FAMILY, v, &family) == FcResultMatch; - ++v) { - FontsByFcStrEntry *entry = mFontsByFamily.PutEntry(family); - if (entry) { - bool added = entry->AddFont(font); - - if (!entry->mKey) { - // The reference to the font pattern keeps the pointer - // to string for the key valid. If adding the font - // failed then the entry must be removed. - if (added) { - entry->mKey = family; - } else { - mFontsByFamily.RemoveEntry(entry); - } - } - } - } - } - } - - mLastConfig = currentConfig; - return NS_OK; -} - -nsresult -gfxFontconfigUtils::GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName) -{ - aFamilyName.Truncate(); - - // The fontconfig has generic family names in the font list. - if (aFontName.EqualsLiteral("serif") || - aFontName.EqualsLiteral("sans-serif") || - aFontName.EqualsLiteral("monospace")) { - aFamilyName.Assign(aFontName); - return NS_OK; - } - - nsresult rv = UpdateFontListInternal(); - if (NS_FAILED(rv)) - return rv; - - NS_ConvertUTF16toUTF8 fontname(aFontName); - - // return empty string if no such family exists - if (!IsExistingFamily(fontname)) - return NS_OK; - - FcPattern *pat = nullptr; - FcObjectSet *os = nullptr; - FcFontSet *givenFS = nullptr; - nsTArray candidates; - FcFontSet *candidateFS = nullptr; - rv = NS_ERROR_FAILURE; - - pat = FcPatternCreate(); - if (!pat) - goto end; - - FcPatternAddString(pat, FC_FAMILY, (FcChar8 *)fontname.get()); - - os = FcObjectSetBuild(FC_FAMILY, FC_FILE, FC_INDEX, nullptr); - if (!os) - goto end; - - givenFS = FcFontList(nullptr, pat, os); - if (!givenFS) - goto end; - - // The first value associated with a FC_FAMILY property is the family - // returned by GetFontList(), so use this value if appropriate. - - // See if there is a font face with first family equal to the given family. - for (int i = 0; i < givenFS->nfont; ++i) { - char *firstFamily; - if (FcPatternGetString(givenFS->fonts[i], FC_FAMILY, 0, - (FcChar8 **) &firstFamily) != FcResultMatch) - continue; - - nsDependentCString first(firstFamily); - if (!candidates.Contains(first)) { - candidates.AppendElement(first); - - if (fontname.Equals(first)) { - aFamilyName.Assign(aFontName); - rv = NS_OK; - goto end; - } - } - } - - // See if any of the first family names represent the same set of font - // faces as the given family. - for (uint32_t j = 0; j < candidates.Length(); ++j) { - FcPatternDel(pat, FC_FAMILY); - FcPatternAddString(pat, FC_FAMILY, (FcChar8 *)candidates[j].get()); - - candidateFS = FcFontList(nullptr, pat, os); - if (!candidateFS) - goto end; - - if (candidateFS->nfont != givenFS->nfont) - continue; - - bool equal = true; - for (int i = 0; i < givenFS->nfont; ++i) { - if (!FcPatternEqual(candidateFS->fonts[i], givenFS->fonts[i])) { - equal = false; - break; - } - } - if (equal) { - AppendUTF8toUTF16(candidates[j], aFamilyName); - rv = NS_OK; - goto end; - } - } - - // No match found; return empty string. - rv = NS_OK; - - end: - if (pat) - FcPatternDestroy(pat); - if (os) - FcObjectSetDestroy(os); - if (givenFS) - FcFontSetDestroy(givenFS); - if (candidateFS) - FcFontSetDestroy(candidateFS); - - return rv; -} - -bool -gfxFontconfigUtils::IsExistingFamily(const nsCString& aFamilyName) -{ - return mFontsByFamily.GetEntry(ToFcChar8(aFamilyName)) != nullptr; -} - -const nsTArray< nsCountedRef >& -gfxFontconfigUtils::GetFontsForFamily(const FcChar8 *aFamilyName) -{ - FontsByFcStrEntry *entry = mFontsByFamily.GetEntry(aFamilyName); - - if (!entry) - return mEmptyPatternArray; - - return entry->GetFonts(); -} - -// Fontconfig only provides a fullname property for fonts in formats with SFNT -// wrappers. For other font formats (including PCF and PS Type 1), a fullname -// must be generated from the family and style properties. Only the first -// family and style is checked, but that should be OK, as I don't expect -// non-SFNT fonts to have multiple families or styles. -bool -gfxFontconfigUtils::GetFullnameFromFamilyAndStyle(FcPattern *aFont, - nsACString *aFullname) -{ - FcChar8 *family; - if (FcPatternGetString(aFont, FC_FAMILY, 0, &family) != FcResultMatch) - return false; - - aFullname->Truncate(); - aFullname->Append(ToCString(family)); - - FcChar8 *style; - if (FcPatternGetString(aFont, FC_STYLE, 0, &style) == FcResultMatch && - strcmp(ToCString(style), "Regular") != 0) { - aFullname->Append(' '); - aFullname->Append(ToCString(style)); - } - - return true; -} - -bool -gfxFontconfigUtils::FontsByFullnameEntry::KeyEquals(KeyTypePointer aKey) const -{ - const FcChar8 *key = mKey; - // If mKey is nullptr, key comes from the style and family of the first - // font. - nsAutoCString fullname; - if (!key) { - NS_ASSERTION(mFonts.Length(), "No font in FontsByFullnameEntry!"); - GetFullnameFromFamilyAndStyle(mFonts[0], &fullname); - - key = ToFcChar8(fullname); - } - - return FcStrCmpIgnoreCase(aKey, key) == 0; -} - -void -gfxFontconfigUtils::AddFullnameEntries() -{ - // These FcFontSets are owned by fontconfig - FcFontSet *fontSets[] = { - FcConfigGetFonts(nullptr, FcSetSystem) -#ifdef MOZ_BUNDLED_FONTS - , FcConfigGetFonts(nullptr, FcSetApplication) -#endif - }; - - for (unsigned fs = 0; fs < ArrayLength(fontSets); ++fs) { - FcFontSet *fontSet = fontSets[fs]; - if (!fontSet) { - continue; - } - // Record the existing font families - for (int f = 0; f < fontSet->nfont; ++f) { - FcPattern *font = fontSet->fonts[f]; - - int v = 0; - FcChar8 *fullname; - while (FcPatternGetString(font, - FC_FULLNAME, v, &fullname) == FcResultMatch) { - FontsByFullnameEntry *entry = - mFontsByFullname.PutEntry(fullname); - if (entry) { - // entry always has space for one font, so the first - // AddFont will always succeed, and so the entry will - // always have a font from which to obtain the key. - bool added = entry->AddFont(font); - // The key may be nullptr either if this is the first - // font, or if the first font does not have a fullname - // property, and so the key is obtained from the font. - // Set the key in both cases. The check that AddFont - // succeeded is required for the second case. - if (!entry->mKey && added) { - entry->mKey = fullname; - } - } - - ++v; - } - - // Fontconfig does not provide a fullname property for all fonts. - if (v == 0) { - nsAutoCString name; - if (!GetFullnameFromFamilyAndStyle(font, &name)) - continue; - - FontsByFullnameEntry *entry = - mFontsByFullname.PutEntry(ToFcChar8(name)); - if (entry) { - entry->AddFont(font); - // Either entry->mKey has been set for a previous font or it - // remains nullptr to indicate that the key is obtained from - // the first font. - } - } - } - } -} - -const nsTArray< nsCountedRef >& -gfxFontconfigUtils::GetFontsForFullname(const FcChar8 *aFullname) -{ - if (mFontsByFullname.Count() == 0) { - AddFullnameEntries(); - } - - FontsByFullnameEntry *entry = mFontsByFullname.GetEntry(aFullname); - - if (!entry) - return mEmptyPatternArray; - - return entry->GetFonts(); -} - -static FcLangResult -CompareLangString(const FcChar8 *aLangA, const FcChar8 *aLangB) { - FcLangResult result = FcLangDifferentLang; - for (uint32_t i = 0; ; ++i) { - FcChar8 a = FcToLower(aLangA[i]); - FcChar8 b = FcToLower(aLangB[i]); - - if (a != b) { - if ((a == '\0' && b == '-') || (a == '-' && b == '\0')) - return FcLangDifferentCountry; - - return result; - } - if (a == '\0') - return FcLangEqual; - - if (a == '-') { - result = FcLangDifferentCountry; - } - } -} - -/* static */ -FcLangResult -gfxFontconfigUtils::GetLangSupport(FcPattern *aFont, const FcChar8 *aLang) -{ - // When fontconfig builds a pattern for a system font, it will set a - // single LangSet property value for the font. That value may be removed - // and additional string values may be added through FcConfigSubsitute - // with FcMatchScan. Values that are neither LangSet nor string are - // considered errors in fontconfig sort and match functions. - // - // If no string nor LangSet value is found, then either the font is a - // system font and the LangSet has been removed through FcConfigSubsitute, - // or the font is a web font and its language support is unknown. - // Returning FcLangDifferentLang for these fonts ensures that this font - // will not be assumed to satisfy the language, and so language will be - // prioritized in sorting fallback fonts. - FcValue value; - FcLangResult best = FcLangDifferentLang; - for (int v = 0; - FcPatternGet(aFont, FC_LANG, v, &value) == FcResultMatch; - ++v) { - - FcLangResult support; - switch (value.type) { - case FcTypeLangSet: - support = FcLangSetHasLang(value.u.l, aLang); - break; - case FcTypeString: - support = CompareLangString(value.u.s, aLang); - break; - default: - // error. continue to see if there is a useful value. - continue; - } - - if (support < best) { // lower is better - if (support == FcLangEqual) - return support; - best = support; - } - } - - return best; -} - -gfxFontconfigUtils::LangSupportEntry * -gfxFontconfigUtils::GetLangSupportEntry(const FcChar8 *aLang, bool aWithFonts) -{ - // Currently any unrecognized languages from documents will be converted - // to x-unicode by nsILanguageAtomService, so there is a limit on the - // langugages that will be added here. Reconsider when/if document - // languages are passed to this routine. - - LangSupportEntry *entry = mLangSupportTable.PutEntry(aLang); - if (!entry) - return nullptr; - - FcLangResult best = FcLangDifferentLang; - - if (!entry->IsKeyInitialized()) { - entry->InitKey(aLang); - } else { - // mSupport is already initialized. - if (!aWithFonts) - return entry; - - best = entry->mSupport; - // If there is support for this language, an empty font list indicates - // that the list hasn't been initialized yet. - if (best == FcLangDifferentLang || entry->mFonts.Length() > 0) - return entry; - } - - // These FcFontSets are owned by fontconfig - FcFontSet *fontSets[] = { - FcConfigGetFonts(nullptr, FcSetSystem) -#ifdef MOZ_BUNDLED_FONTS - , FcConfigGetFonts(nullptr, FcSetApplication) -#endif - }; - - AutoTArray fonts; - - for (unsigned fs = 0; fs < ArrayLength(fontSets); ++fs) { - FcFontSet *fontSet = fontSets[fs]; - if (!fontSet) { - continue; - } - for (int f = 0; f < fontSet->nfont; ++f) { - FcPattern *font = fontSet->fonts[f]; - - FcLangResult support = GetLangSupport(font, aLang); - - if (support < best) { // lower is better - best = support; - if (aWithFonts) { - fonts.Clear(); - } else if (best == FcLangEqual) { - break; - } - } - - // The font list in the LangSupportEntry is expected to be used - // only when no default fonts support the language. There would - // be a large number of fonts in entries for languages using Latin - // script but these do not need to be created because default - // fonts already support these languages. - if (aWithFonts && support != FcLangDifferentLang && - support == best) { - fonts.AppendElement(font); - } - } - } - - entry->mSupport = best; - if (aWithFonts) { - if (fonts.Length() != 0) { - entry->mFonts.AppendElements(fonts.Elements(), fonts.Length()); - } else if (best != FcLangDifferentLang) { - // Previously there was a font that supported this language at the - // level of entry->mSupport, but it has now disappeared. At least - // entry->mSupport needs to be recalculated, but this is an - // indication that the set of installed fonts has changed, so - // update all caches. - mLastConfig = nullptr; // invalidates caches - UpdateFontListInternal(true); - return GetLangSupportEntry(aLang, aWithFonts); - } - } - - return entry; -} - -FcLangResult -gfxFontconfigUtils::GetBestLangSupport(const FcChar8 *aLang) -{ - UpdateFontListInternal(); - - LangSupportEntry *entry = GetLangSupportEntry(aLang, false); - if (!entry) - return FcLangEqual; - - return entry->mSupport; -} - -const nsTArray< nsCountedRef >& -gfxFontconfigUtils::GetFontsForLang(const FcChar8 *aLang) -{ - LangSupportEntry *entry = GetLangSupportEntry(aLang, true); - if (!entry) - return mEmptyPatternArray; - - return entry->mFonts; -} - -#ifdef MOZ_BUNDLED_FONTS - -void -gfxFontconfigUtils::ActivateBundledFonts() -{ - if (!mBundledFontsInitialized) { - mBundledFontsInitialized = true; - nsCOMPtr localDir; - nsresult rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(localDir)); - if (NS_FAILED(rv)) { - return; - } - if (NS_FAILED(localDir->Append(NS_LITERAL_STRING("fonts")))) { - return; - } - bool isDir; - if (NS_FAILED(localDir->IsDirectory(&isDir)) || !isDir) { - return; - } - if (NS_FAILED(localDir->GetNativePath(mBundledFontsPath))) { - return; - } - } - if (!mBundledFontsPath.IsEmpty()) { - FcConfigAppFontAddDir(nullptr, (const FcChar8*)mBundledFontsPath.get()); - } -} - -#endif - -gfxFontconfigFontBase::gfxFontconfigFontBase(cairo_scaled_font_t *aScaledFont, - FcPattern *aPattern, - gfxFontEntry *aFontEntry, - const gfxFontStyle *aFontStyle) - : gfxFT2FontBase(aScaledFont, aFontEntry, aFontStyle) - , mPattern(aPattern) -{ -} - diff --git a/gfx/thebes/gfxFontconfigUtils.h b/gfx/thebes/gfxFontconfigUtils.h index eee69e481646b..3f502c124345d 100644 --- a/gfx/thebes/gfxFontconfigUtils.h +++ b/gfx/thebes/gfxFontconfigUtils.h @@ -8,11 +8,7 @@ #include "gfxPlatform.h" -#include "mozilla/MathAlgorithms.h" #include "nsAutoRef.h" -#include "nsTArray.h" -#include "nsTHashtable.h" -#include "nsISupportsImpl.h" #include "gfxFT2FontBase.h" #include @@ -40,285 +36,14 @@ class nsAutoRefTraits : public nsPointerRefTraits static void Release(FcCharSet *ptr) { FcCharSetDestroy(ptr); } }; -class gfxIgnoreCaseCStringComparator -{ - public: - bool Equals(const nsACString& a, const nsACString& b) const - { - return nsCString(a).Equals(b, nsCaseInsensitiveCStringComparator()); - } - - bool LessThan(const nsACString& a, const nsACString& b) const - { - return a < b; - } -}; - -class gfxFontconfigUtils { -public: - gfxFontconfigUtils(); - - static gfxFontconfigUtils* GetFontconfigUtils() { - if (!sUtils) - sUtils = new gfxFontconfigUtils(); - return sUtils; - } - - static void Shutdown(); - - nsresult GetFontList(nsIAtom *aLangGroup, - const nsACString& aGenericFamily, - nsTArray& aListOfFonts); - - nsresult UpdateFontList(); - - nsresult GetStandardFamilyName(const nsAString& aFontName, nsAString& aFamilyName); - - const nsTArray< nsCountedRef >& - GetFontsForFamily(const FcChar8 *aFamilyName); - - const nsTArray< nsCountedRef >& - GetFontsForFullname(const FcChar8 *aFullname); - - // Returns the best support that any font offers for |aLang|. - FcLangResult GetBestLangSupport(const FcChar8 *aLang); - // Returns the fonts offering this best level of support. - const nsTArray< nsCountedRef >& - GetFontsForLang(const FcChar8 *aLang); - - // Retuns the language support for a fontconfig font pattern - static FcLangResult GetLangSupport(FcPattern *aFont, const FcChar8 *aLang); - - // Conversions between FcChar8*, which is unsigned char*, - // and (signed) char*, that check the type of the argument. - static const FcChar8 *ToFcChar8(const char *aCharPtr) - { - return reinterpret_cast(aCharPtr); - } - static const FcChar8 *ToFcChar8(const nsCString& aCString) - { - return ToFcChar8(aCString.get()); - } - static const char *ToCString(const FcChar8 *aChar8Ptr) - { - return reinterpret_cast(aChar8Ptr); - } - - static uint8_t FcSlantToThebesStyle(int aFcSlant); - static uint8_t GetThebesStyle(FcPattern *aPattern); // slant - static uint16_t GetThebesWeight(FcPattern *aPattern); - static int16_t GetThebesStretch(FcPattern *aPattern); - - static int GetFcSlant(const gfxFontStyle& aFontStyle); - // Returns a precise FC_WEIGHT from |aBaseWeight|, - // which is a CSS absolute weight / 100. - static int FcWeightForBaseWeight(int8_t aBaseWeight); - - static int FcWidthForThebesStretch(int16_t aStretch); - - static bool GetFullnameFromFamilyAndStyle(FcPattern *aFont, - nsACString *aFullname); - - // This doesn't consider which faces exist, and so initializes the pattern - // using a guessed weight, and doesn't consider sizeAdjust. - static nsReturnRef - NewPattern(const nsTArray& aFamilies, - const gfxFontStyle& aFontStyle, const char *aLang); - - /** - * @param aLangGroup [in] a Mozilla langGroup. - * @param aFcLang [out] returns a language suitable for fontconfig - * matching |aLangGroup| or an empty string if no match is found. - */ - static void GetSampleLangForGroup(nsIAtom *aLangGroup, - nsACString *aFcLang); - -protected: - // Base class for hash table entries with case-insensitive FcChar8 - // string keys. - class FcStrEntryBase : public PLDHashEntryHdr { - public: - typedef const FcChar8 *KeyType; - typedef const FcChar8 *KeyTypePointer; - - static KeyTypePointer KeyToPointer(KeyType aKey) { return aKey; } - // Case-insensitive hash. - // - // fontconfig always ignores case of ASCII characters in family - // names and languages, but treatment of whitespace in families is - // not consistent. FcFontSort and FcFontMatch ignore whitespace - // except for whitespace in the first character, while FcFontList - // and config subsitution tests require whitespace to match - // exactly. CSS 2.1 implies that whitespace is important in the - // font-family property. FcStrCmpIgnoreCase considers whitespace - // important. - static PLDHashNumber HashKey(const FcChar8 *aKey) { - uint32_t hash = 0; - for (const FcChar8 *c = aKey; *c != '\0'; ++c) { - hash = mozilla::RotateLeft(hash, 3) ^ FcToLower(*c); - } - return hash; - } - enum { ALLOW_MEMMOVE = true }; - }; - -public: - // Hash entry with a dependent const FcChar8* pointer to an external - // string for a key (and no data). The user must ensure that the string - // associated with the pointer is not destroyed. This entry type is - // useful for family name keys as the family name string is held in the - // font pattern. - class DepFcStrEntry : public FcStrEntryBase { - public: - // When constructing a new entry in the hashtable, the key is left - // nullptr. The caller of PutEntry() must fill in mKey when nullptr. - // This provides a mechanism for the caller of PutEntry() to determine - // whether the entry has been initialized. - explicit DepFcStrEntry(KeyTypePointer aName) - : mKey(nullptr) { } - - DepFcStrEntry(const DepFcStrEntry& toCopy) - : mKey(toCopy.mKey) { } - - bool KeyEquals(KeyTypePointer aKey) const { - return FcStrCmpIgnoreCase(aKey, mKey) == 0; - } - - const FcChar8 *mKey; - }; - - // Hash entry that uses a copy of an FcChar8 string to store the key. - // This entry type is useful for language keys, as languages are usually - // not stored as strings in font patterns. - class CopiedFcStrEntry : public FcStrEntryBase { - public: - // When constructing a new entry in the hashtable, the key is void. - // The caller of PutEntry() must call InitKey() when IsKeyInitialized() - // returns false. This provides a mechanism for the caller of - // PutEntry() to determine whether the entry has been initialized. - explicit CopiedFcStrEntry(KeyTypePointer aName) { - mKey.SetIsVoid(true); - } - - CopiedFcStrEntry(const CopiedFcStrEntry& toCopy) - : mKey(toCopy.mKey) { } - - bool KeyEquals(KeyTypePointer aKey) const { - return FcStrCmpIgnoreCase(aKey, ToFcChar8(mKey)) == 0; - } - - bool IsKeyInitialized() { return !mKey.IsVoid(); } - void InitKey(const FcChar8* aKey) { mKey.Assign(ToCString(aKey)); } - - private: - nsCString mKey; - }; - -protected: - class FontsByFcStrEntry : public DepFcStrEntry { - public: - explicit FontsByFcStrEntry(KeyTypePointer aName) - : DepFcStrEntry(aName) { } - - FontsByFcStrEntry(const FontsByFcStrEntry& toCopy) - : DepFcStrEntry(toCopy), mFonts(toCopy.mFonts) { } - - bool AddFont(FcPattern *aFont) { - return mFonts.AppendElement(aFont) != nullptr; - } - const nsTArray< nsCountedRef >& GetFonts() { - return mFonts; - } - private: - nsTArray< nsCountedRef > mFonts; - }; - - // FontsByFullnameEntry is similar to FontsByFcStrEntry (used for - // mFontsByFamily) except for two differences: - // - // * The font does not always contain a single string for the fullname, so - // the key is sometimes a combination of family and style. - // - // * There is usually only one font. - class FontsByFullnameEntry : public DepFcStrEntry { - public: - // When constructing a new entry in the hashtable, the key is left - // nullptr. The caller of PutEntry() is must fill in mKey when adding - // the first font if the key is not derived from the family and style. - // If the key is derived from family and style, a font must be added. - explicit FontsByFullnameEntry(KeyTypePointer aName) - : DepFcStrEntry(aName) { } - - FontsByFullnameEntry(const FontsByFullnameEntry& toCopy) - : DepFcStrEntry(toCopy), mFonts(toCopy.mFonts) { } - - bool KeyEquals(KeyTypePointer aKey) const; - - bool AddFont(FcPattern *aFont) { - return mFonts.AppendElement(aFont) != nullptr; - } - const nsTArray< nsCountedRef >& GetFonts() { - return mFonts; - } - - // Don't memmove the AutoTArray. - enum { ALLOW_MEMMOVE = false }; - private: - // There is usually only one font, but sometimes more. - AutoTArray,1> mFonts; - }; - - class LangSupportEntry : public CopiedFcStrEntry { - public: - explicit LangSupportEntry(KeyTypePointer aName) - : CopiedFcStrEntry(aName) { } - - LangSupportEntry(const LangSupportEntry& toCopy) - : CopiedFcStrEntry(toCopy), mSupport(toCopy.mSupport) { } - - FcLangResult mSupport; - nsTArray< nsCountedRef > mFonts; - }; - - static gfxFontconfigUtils* sUtils; - - bool IsExistingFamily(const nsCString& aFamilyName); - - nsresult GetFontListInternal(nsTArray& aListOfFonts, - nsIAtom *aLangGroup); - nsresult UpdateFontListInternal(bool aForce = false); - - void AddFullnameEntries(); - - LangSupportEntry *GetLangSupportEntry(const FcChar8 *aLang, - bool aWithFonts); - - // mFontsByFamily and mFontsByFullname contain entries only for families - // and fullnames for which there are fonts. - nsTHashtable mFontsByFamily; - nsTHashtable mFontsByFullname; - // mLangSupportTable contains an entry for each language that has been - // looked up through GetLangSupportEntry, even when the language is not - // supported. - nsTHashtable mLangSupportTable; - const nsTArray< nsCountedRef > mEmptyPatternArray; - - FcConfig *mLastConfig; - -#ifdef MOZ_BUNDLED_FONTS - void ActivateBundledFonts(); - - nsCString mBundledFontsPath; - bool mBundledFontsInitialized; -#endif -}; - class gfxFontconfigFontBase : public gfxFT2FontBase { public: gfxFontconfigFontBase(cairo_scaled_font_t *aScaledFont, FcPattern *aPattern, gfxFontEntry *aFontEntry, - const gfxFontStyle *aFontStyle); + const gfxFontStyle *aFontStyle) + : gfxFT2FontBase(aScaledFont, aFontEntry, aFontStyle) + , mPattern(aPattern) { } virtual FontType GetType() const override { return FONT_TYPE_FONTCONFIG; } virtual FcPattern *GetPattern() const { return mPattern; } diff --git a/gfx/thebes/gfxTextRun.cpp b/gfx/thebes/gfxTextRun.cpp index 8f6c359a78bdc..6e968736feacd 100644 --- a/gfx/thebes/gfxTextRun.cpp +++ b/gfx/thebes/gfxTextRun.cpp @@ -1711,7 +1711,6 @@ gfxFontGroup::gfxFontGroup(const FontFamilyList& aFontFamilyList, , mPageLang(gfxPlatformFontList::GetFontPrefLangFor(aStyle->language)) , mLastPrefFirstFont(false) , mSkipDrawing(false) - , mSkipUpdateUserFonts(false) { // We don't use SetUserFontSet() here, as we want to unconditionally call // BuildFontList() rather than only do UpdateUserFonts() if it changed. @@ -2440,7 +2439,7 @@ gfxFontGroup::InitScriptRun(DrawTarget* aDrawTarget, "don't call InitScriptRun with aborted shaping state"); // confirm the load state of userfonts in the list - if (!mSkipUpdateUserFonts && mUserFontSet && + if (mUserFontSet && mCurrGeneration != mUserFontSet->GetGeneration()) { UpdateUserFonts(); } @@ -3178,8 +3177,6 @@ gfxFontGroup::GetRebuildGeneration() return mUserFontSet->GetRebuildGeneration(); } -// note: gfxPangoFontGroup overrides UpdateUserFonts, such that -// BuildFontList is never used void gfxFontGroup::UpdateUserFonts() { diff --git a/gfx/thebes/gfxTextRun.h b/gfx/thebes/gfxTextRun.h index e817518982da2..2e1f4b495be85 100644 --- a/gfx/thebes/gfxTextRun.h +++ b/gfx/thebes/gfxTextRun.h @@ -1115,9 +1115,6 @@ class gfxFontGroup : public gfxTextRunFactory { // download to complete (or fallback // timer to fire) - // xxx - gfxPangoFontGroup skips UpdateUserFonts - bool mSkipUpdateUserFonts; - /** * Textrun creation short-cuts for special cases where we don't need to * call a font shaper to generate glyphs. diff --git a/gfx/thebes/gfxUserFontSet.cpp b/gfx/thebes/gfxUserFontSet.cpp index d918b4877d688..8fc68c9c7fd17 100644 --- a/gfx/thebes/gfxUserFontSet.cpp +++ b/gfx/thebes/gfxUserFontSet.cpp @@ -978,32 +978,6 @@ gfxUserFontSet::AddUserFontEntry(const nsAString& aFamilyName, } } -gfxUserFontEntry* -gfxUserFontSet::FindUserFontEntryAndLoad(gfxFontFamily* aFamily, - const gfxFontStyle& aFontStyle, - bool& aNeedsBold, - bool& aWaitForUserFont) -{ - aWaitForUserFont = false; - gfxFontEntry* fe = aFamily->FindFontForStyle(aFontStyle, aNeedsBold); - NS_ASSERTION(!fe || fe->mIsUserFontContainer, - "should only have userfont entries in userfont families"); - if (!fe) { - return nullptr; - } - - gfxUserFontEntry* userFontEntry = static_cast(fe); - - // start the load if it hasn't been loaded - userFontEntry->Load(); - if (userFontEntry->GetPlatformFontEntry()) { - return userFontEntry; - } - - aWaitForUserFont = userFontEntry->WaitForUserFont(); - return nullptr; -} - void gfxUserFontSet::IncrementGeneration(bool aIsRebuild) { diff --git a/gfx/thebes/gfxUserFontSet.h b/gfx/thebes/gfxUserFontSet.h index 0a5da53830f67..c869d89119335 100644 --- a/gfx/thebes/gfxUserFontSet.h +++ b/gfx/thebes/gfxUserFontSet.h @@ -248,14 +248,6 @@ class gfxUserFontSet { // Look up names in a fontlist and return true if any are in the set bool ContainsUserFontSetFonts(const mozilla::FontFamilyList& aFontList) const; - // Lookup a font entry for a given style, returns null if not loaded. - // aFamily must be a family returned by our LookupFamily method. - // (only used by gfxPangoFontGroup for now) - gfxUserFontEntry* FindUserFontEntryAndLoad(gfxFontFamily* aFamily, - const gfxFontStyle& aFontStyle, - bool& aNeedsBold, - bool& aWaitForUserFont); - // check whether the given source is allowed to be loaded; // returns the Principal (for use in the key when caching the loaded font), // and whether the load should bypass the cache (force-reload). diff --git a/gfx/thebes/moz.build b/gfx/thebes/moz.build index a08aa27b1b7c8..f51288fcbd11c 100644 --- a/gfx/thebes/moz.build +++ b/gfx/thebes/moz.build @@ -110,8 +110,6 @@ elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']: ] SOURCES += [ 'gfxFcPlatformFontList.cpp', - 'gfxFontconfigFonts.cpp', - 'gfxFontconfigUtils.cpp', 'gfxFT2FontBase.cpp', 'gfxFT2Utils.cpp', 'gfxGdkNativeRenderer.cpp', From 2cd011b2c59f0db6fbae991684b4c2604115916c Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Wed, 22 Mar 2017 15:03:03 -0400 Subject: [PATCH 283/300] Bug 1347262 - fix Skia's round_asymmetric_to_int to bias all sides. r=jrmuizel MozReview-Commit-ID: AMDi6YF0zn --- gfx/skia/skia/src/core/SkScan_Path.cpp | 51 +++++++++++++------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/gfx/skia/skia/src/core/SkScan_Path.cpp b/gfx/skia/skia/src/core/SkScan_Path.cpp index a3116bb929221..5b80492cfa284 100644 --- a/gfx/skia/skia/src/core/SkScan_Path.cpp +++ b/gfx/skia/skia/src/core/SkScan_Path.cpp @@ -592,29 +592,35 @@ static bool clip_to_limit(const SkRegion& orig, SkRegion* reduced) { } /** - * Variant of SkScalarRoundToInt, identical to SkDScalarRoundToInt except when the input fraction - * is 0.5. In this case only, round the value down. This is used to round the top and left - * of a rectangle, and corresponds to the way the scan converter treats the top and left edges. + * Variants of SkScalarRoundToInt, identical to SkDScalarRoundToInt except when the input fraction + * is 0.5. When SK_RASTERIZE_EVEN_ROUNDING is enabled, we must bias the result before rounding to + * account for potential FDot6 rounding edge-cases. + */ +#ifdef SK_RASTERIZE_EVEN_ROUNDING +static const double kRoundBias = 0.5 / SK_FDot6One; +#else +static const double kRoundBias = 0.0; +#endif + +/** + * Round the value down. This is used to round the top and left of a rectangle, + * and corresponds to the way the scan converter treats the top and left edges. */ static inline int round_down_to_int(SkScalar x) { double xx = x; - xx += 0.5; - double floorXX = floor(xx); - return (int)floorXX - (xx == floorXX); + xx -= 0.5 + kRoundBias; + return (int)ceil(xx); } -#ifdef SK_RASTERIZE_EVEN_ROUNDING /** - * Variant of SkDScalarRoundToInt that allows offseting the input by a small fraction - * while trying to preserve intermediate double-precision (rather than directly adding - * the bias to the input at lower single-precision). + * Round the value up. This is used to round the bottom and right of a rectangle, + * and corresponds to the way the scan converter treats the bottom and right edges. */ -static inline int round_biased_to_int(SkScalar x, SkScalar bias) { +static inline int round_up_to_int(SkScalar x) { double xx = x; - xx += 0.5 + bias; + xx += 0.5 + kRoundBias; return (int)floor(xx); } -#endif /** * Variant of SkRect::round() that explicitly performs the rounding step (i.e. floor(x + 0.5)) @@ -635,26 +641,21 @@ static inline int round_biased_to_int(SkScalar x, SkScalar bias) { * SkASSERT(0 == iright); // <--- succeeds * * - * If using SK_RASTERIZE_EVEN_ROUNDING, we need to ensure that bottom and right account for - * edges bounded by this rect being rounded to FDot6 format before being later rounded to an - * integer. For example, a value like 0.499 can be below 0.5, but round to 0.5 as FDot6, which - * would finally round to the integer 1, instead of just rounding to 0. + * If using SK_RASTERIZE_EVEN_ROUNDING, we need to ensure we account for edges bounded by this + * rect being rounded to FDot6 format before being later rounded to an integer. For example, a + * value like 0.499 can be below 0.5, but round to 0.5 as FDot6, which would finally round to + * the integer 1, instead of just rounding to 0. * * To handle this, a small bias of half an FDot6 increment is added before actually rounding to * an integer value. This simulates the rounding of SkScalarRoundToFDot6 without incurring the * range loss of converting to FDot6 format first, preserving the integer range for the SkIRect. - * Thus, bottom and right are rounded in this manner (biased up), ensuring the rect is large enough. - * Top and left can round as normal since they will round (biased down) to values less or equal - * to the desired rect origin. + * Thus, bottom and right are rounded in this manner (biased up), ensuring the rect is large + * enough. */ static void round_asymmetric_to_int(const SkRect& src, SkIRect* dst) { SkASSERT(dst); dst->set(round_down_to_int(src.fLeft), round_down_to_int(src.fTop), -#ifdef SK_RASTERIZE_EVEN_ROUNDING - round_biased_to_int(src.fRight, 0.5f / SK_FDot6One), round_biased_to_int(src.fBottom, 0.5f / SK_FDot6One)); -#else - SkDScalarRoundToInt(src.fRight), SkDScalarRoundToInt(src.fBottom)); -#endif + round_up_to_int(src.fRight), round_up_to_int(src.fBottom)); } void SkScan::FillPath(const SkPath& path, const SkRegion& origClip, From aa324c09770130b869da0a08494d687b19c827e4 Mon Sep 17 00:00:00 2001 From: Sebastian Hengst Date: Wed, 22 Mar 2017 20:28:39 +0100 Subject: [PATCH 284/300] Backed out changeset ef22dba0dac5 (bug 1316683) for various test failures, e.g. xpcshell netwerk/test/unit/test_bug826063.js and browser-chrome browser/components/downloads/test/browser/browser_iframe_gone_mid_download.js. r=backout on a CLOSED TREE --- caps/nsScriptSecurityManager.cpp | 3 +- docshell/base/LoadContext.cpp | 30 +++++++++++++++---- docshell/base/LoadContext.h | 2 -- docshell/base/SerializedLoadContext.cpp | 4 ++- docshell/base/nsDocShell.cpp | 6 ---- docshell/base/nsDocShell.h | 2 -- docshell/base/nsILoadContext.idl | 6 ++-- dom/base/nsDocument.h | 20 ++++--------- dom/ipc/TabParent.cpp | 1 - dom/offline/nsDOMOfflineResourceList.cpp | 3 +- .../prefetch/OfflineCacheUpdateParent.cpp | 8 ----- uriloader/prefetch/OfflineCacheUpdateParent.h | 2 -- 12 files changed, 41 insertions(+), 46 deletions(-) diff --git a/caps/nsScriptSecurityManager.cpp b/caps/nsScriptSecurityManager.cpp index 7d70c97a8f1e6..0d587f8115a3c 100644 --- a/caps/nsScriptSecurityManager.cpp +++ b/caps/nsScriptSecurityManager.cpp @@ -1168,7 +1168,8 @@ nsScriptSecurityManager:: { NS_ENSURE_STATE(aLoadContext); OriginAttributes docShellAttrs; - aLoadContext->GetOriginAttributes(docShellAttrs); + bool result = aLoadContext->GetOriginAttributes(docShellAttrs); + NS_ENSURE_TRUE(result, NS_ERROR_FAILURE); nsCOMPtr prin = BasePrincipal::CreateCodebasePrincipal(aURI, docShellAttrs); diff --git a/docshell/base/LoadContext.cpp b/docshell/base/LoadContext.cpp index 03fa532731890..6c3ba6b523119 100644 --- a/docshell/base/LoadContext.cpp +++ b/docshell/base/LoadContext.cpp @@ -12,6 +12,30 @@ #include "nsContentUtils.h" #include "xpcpublic.h" +bool +nsILoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) +{ + mozilla::dom::AutoJSAPI jsapi; + bool ok = jsapi.Init(xpc::PrivilegedJunkScope()); + NS_ENSURE_TRUE(ok, false); + JS::Rooted v(jsapi.cx()); + nsresult rv = GetOriginAttributes(&v); + NS_ENSURE_SUCCESS(rv, false); + NS_ENSURE_TRUE(v.isObject(), false); + JS::Rooted obj(jsapi.cx(), &v.toObject()); + + // If we're JS-implemented, the object will be left in a different (System-Principaled) + // scope, so we may need to enter its compartment. + MOZ_ASSERT(nsContentUtils::IsSystemPrincipal(nsContentUtils::ObjectPrincipal(obj))); + JSAutoCompartment ac(jsapi.cx(), obj); + + mozilla::OriginAttributes attrs; + ok = attrs.Init(jsapi.cx(), v); + NS_ENSURE_TRUE(ok, false); + aAttrs = attrs; + return true; +} + namespace mozilla { NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor) @@ -157,12 +181,6 @@ LoadContext::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } -NS_IMETHODIMP_(void) -LoadContext::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - aAttrs = mOriginAttributes; -} - NS_IMETHODIMP LoadContext::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/docshell/base/LoadContext.h b/docshell/base/LoadContext.h index dc0012c76d3c8..0b05899ab9346 100644 --- a/docshell/base/LoadContext.h +++ b/docshell/base/LoadContext.h @@ -111,8 +111,6 @@ class LoadContext final private: ~LoadContext() {} - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; - nsWeakPtr mTopFrameElement; uint64_t mNestedFrameId; bool mIsContent; diff --git a/docshell/base/SerializedLoadContext.cpp b/docshell/base/SerializedLoadContext.cpp index 3964a78f9fc3e..501a417a5125a 100644 --- a/docshell/base/SerializedLoadContext.cpp +++ b/docshell/base/SerializedLoadContext.cpp @@ -62,7 +62,9 @@ SerializedLoadContext::Init(nsILoadContext* aLoadContext) aLoadContext->GetIsContent(&mIsContent); aLoadContext->GetUseRemoteTabs(&mUseRemoteTabs); aLoadContext->GetUseTrackingProtection(&mUseTrackingProtection); - aLoadContext->GetOriginAttributes(mOriginAttributes); + if (!aLoadContext->GetOriginAttributes(mOriginAttributes)) { + NS_WARNING("GetOriginAttributes failed"); + } } else { mIsNotNull = false; mIsPrivateBitValid = false; diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index d07474e493c3d..6ed2909fb70e1 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -14944,9 +14944,3 @@ nsDocShell::GetAwaitingLargeAlloc(bool* aResult) *aResult = static_cast(tabChild.get())->IsAwaitingLargeAlloc(); return NS_OK; } - -NS_IMETHODIMP_(void) -nsDocShell::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - aAttrs = mOriginAttributes; -} diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index af5416c105c98..9378970233404 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -806,8 +806,6 @@ class nsDocShell final void UpdateGlobalHistoryTitle(nsIURI* aURI); - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; - // Dimensions of the docshell nsIntRect mBounds; nsString mName; diff --git a/docshell/base/nsILoadContext.idl b/docshell/base/nsILoadContext.idl index d3a39a676c79b..98e8a21191714 100644 --- a/docshell/base/nsILoadContext.idl +++ b/docshell/base/nsILoadContext.idl @@ -20,7 +20,7 @@ interface nsIDOMElement; * can be queried for various information about where the load is * happening. */ -[builtinclass, scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] +[scriptable, uuid(2813a7a3-d084-4d00-acd0-f76620315c02)] interface nsILoadContext : nsISupports { /** @@ -139,8 +139,10 @@ interface nsILoadContext : nsISupports #ifdef MOZILLA_INTERNAL_API /** * The C++ getter for origin attributes. + * + * Defined in LoadContext.cpp */ - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) = 0; + bool GetOriginAttributes(mozilla::OriginAttributes& aAttrs); #endif %} }; diff --git a/dom/base/nsDocument.h b/dom/base/nsDocument.h index 05d0cb772e88a..9ef1d404de77f 100644 --- a/dom/base/nsDocument.h +++ b/dom/base/nsDocument.h @@ -444,7 +444,7 @@ class nsExternalResourceMap // implement one interface. // XXXbz I wish we could just derive the _allcaps thing from _i -#define DECL_SHIM(_i, _allcaps, _customfwd) \ +#define DECL_SHIM(_i, _allcaps) \ class _i##Shim final : public nsIInterfaceRequestor, \ public _i \ { \ @@ -459,25 +459,17 @@ class nsExternalResourceMap NS_DECL_ISUPPORTS \ NS_FORWARD_NSIINTERFACEREQUESTOR(mIfReq->) \ NS_FORWARD_##_allcaps(mRealPtr->) \ - _customfwd \ private: \ nsCOMPtr mIfReq; \ nsCOMPtr<_i> mRealPtr; \ }; -#define DECL_FORWARD_CPP_GETORIGINATTRIBUTES \ - NS_IMETHODIMP_(void) \ - GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override \ - { \ - mRealPtr->GetOriginAttributes(aAttrs); \ - } - DECL_SHIM(nsILoadContext, NSILOADCONTEXT, DECL_FORWARD_CPP_GETORIGINATTRIBUTES) - DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK, ) - DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK, ) - DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK, ) - DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER, ) + DECL_SHIM(nsILoadContext, NSILOADCONTEXT) + DECL_SHIM(nsIProgressEventSink, NSIPROGRESSEVENTSINK) + DECL_SHIM(nsIChannelEventSink, NSICHANNELEVENTSINK) + DECL_SHIM(nsISecurityEventSink, NSISECURITYEVENTSINK) + DECL_SHIM(nsIApplicationCacheContainer, NSIAPPLICATIONCACHECONTAINER) #undef DECL_SHIM -#undef DECL_FORWARD_CPP_GETORIGINATTRIBUTES }; /** diff --git a/dom/ipc/TabParent.cpp b/dom/ipc/TabParent.cpp index e6e144df1a892..87163e1bcb91c 100644 --- a/dom/ipc/TabParent.cpp +++ b/dom/ipc/TabParent.cpp @@ -3020,7 +3020,6 @@ class FakeChannel final : public nsIChannel, NS_IMETHOD SetPrivateBrowsing(bool) NO_IMPL NS_IMETHOD GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL NS_IMETHOD GetOriginAttributes(JS::MutableHandleValue) NO_IMPL - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override {} NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL NS_IMETHOD SetRemoteTabs(bool) NO_IMPL NS_IMETHOD GetUseTrackingProtection(bool*) NO_IMPL diff --git a/dom/offline/nsDOMOfflineResourceList.cpp b/dom/offline/nsDOMOfflineResourceList.cpp index b6b49670b8b76..a02b2956245e5 100644 --- a/dom/offline/nsDOMOfflineResourceList.cpp +++ b/dom/offline/nsDOMOfflineResourceList.cpp @@ -815,7 +815,8 @@ nsDOMOfflineResourceList::CacheKeys() nsAutoCString originSuffix; if (loadContext) { mozilla::OriginAttributes oa; - loadContext->GetOriginAttributes(oa); + bool ok = loadContext->GetOriginAttributes(oa); + NS_ENSURE_TRUE(ok, NS_ERROR_UNEXPECTED); oa.CreateSuffix(originSuffix); } diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.cpp b/uriloader/prefetch/OfflineCacheUpdateParent.cpp index f10821292b715..c77f2b49a02ee 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.cpp +++ b/uriloader/prefetch/OfflineCacheUpdateParent.cpp @@ -276,14 +276,6 @@ OfflineCacheUpdateParent::GetOriginAttributes(JS::MutableHandleValue aAttrs) return NS_OK; } -NS_IMETHODIMP_(void) -OfflineCacheUpdateParent::GetOriginAttributes(mozilla::OriginAttributes& aAttrs) -{ - if (mLoadingPrincipal) { - aAttrs = mLoadingPrincipal->OriginAttributesRef(); - } -} - NS_IMETHODIMP OfflineCacheUpdateParent::GetUseTrackingProtection(bool* aUseTrackingProtection) { diff --git a/uriloader/prefetch/OfflineCacheUpdateParent.h b/uriloader/prefetch/OfflineCacheUpdateParent.h index 2637c6bdca42c..f6dbc1cb2a6f9 100644 --- a/uriloader/prefetch/OfflineCacheUpdateParent.h +++ b/uriloader/prefetch/OfflineCacheUpdateParent.h @@ -54,8 +54,6 @@ class OfflineCacheUpdateParent : public POfflineCacheUpdateParent private: ~OfflineCacheUpdateParent(); - NS_IMETHOD_(void) GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override; - bool mIPCClosed; nsCOMPtr mLoadingPrincipal; From fb0f9c345085372f453fc796f204db751457325a Mon Sep 17 00:00:00 2001 From: cku Date: Thu, 23 Mar 2017 15:29:11 +0800 Subject: [PATCH 285/300] Bug 1349462 - Part 1. Rename IsSVGText as IsInSVGTextSubtree. r=heycam MozReview-Commit-ID: LTo6c8tTtaf --- layout/base/RestyleManager.cpp | 4 +-- layout/base/nsCSSFrameConstructor.cpp | 18 ++++++++------ layout/base/nsLayoutUtils.cpp | 6 ++--- layout/generic/ReflowInput.cpp | 6 ++--- layout/generic/nsBlockFrame.cpp | 8 +++--- layout/generic/nsFrame.cpp | 14 +++++------ layout/generic/nsIFrame.h | 2 -- layout/generic/nsInlineFrame.cpp | 6 ++--- layout/generic/nsLineLayout.cpp | 6 ++--- layout/generic/nsTextFrame.cpp | 35 ++++++++++++++------------- layout/style/nsFontFaceUtils.cpp | 5 ++-- layout/style/nsStyleStructInlines.h | 30 +++++++++++++---------- layout/svg/nsSVGEffects.cpp | 3 ++- layout/svg/nsSVGUtils.cpp | 20 ++++++++------- layout/svg/nsSVGUtils.h | 5 ++++ 15 files changed, 91 insertions(+), 77 deletions(-) diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 4af08df7730ad..521738f014936 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -970,7 +970,7 @@ FrameHasPositionedPlaceholderDescendants(nsIFrame* aFrame, nsPlaceholderFrame::GetRealFrameForPlaceholder(f); // If SVG text frames could appear here, they could confuse us since // they ignore their position style ... but they can't. - NS_ASSERTION(!outOfFlow->IsSVGText(), + NS_ASSERTION(!nsSVGUtils::IsInSVGTextSubtree(outOfFlow), "SVG text frames can't be out of flow"); if (aPositionMask & (1 << outOfFlow->StyleDisplay()->mPosition)) { return true; @@ -1093,7 +1093,7 @@ DoApplyRenderingChangeToTree(nsIFrame* aFrame, } } if (aChange & nsChangeHint_UpdateTextPath) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { // Invalidate and reflow the entire SVGTextFrame: NS_ASSERTION(aFrame->GetContent()->IsSVGElement(nsGkAtoms::textPath), "expected frame for a element"); diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index ff1f6767122c6..823d56e75f45a 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -426,7 +426,7 @@ static bool IsFrameForSVG(const nsIFrame* aFrame) { return aFrame->IsFrameOfType(nsIFrame::eSVG) || - aFrame->IsSVGText(); + nsSVGUtils::IsInSVGTextSubtree(aFrame); } /** @@ -1140,7 +1140,8 @@ nsFrameConstructorState::GetGeometricParent(const nsStyleDisplay* aStyleDisplay, // XXXbz couldn't we just force position to "static" on roots and // float to "none"? That's OK per CSS 2.1, as far as I can tell. - if (aContentParentFrame && aContentParentFrame->IsSVGText()) { + if (aContentParentFrame && + nsSVGUtils::IsInSVGTextSubtree(aContentParentFrame)) { return aContentParentFrame; } @@ -3451,7 +3452,7 @@ nsCSSFrameConstructor::FindTextData(nsIFrame* aParentFrame) static const FrameConstructionData sSVGTextData = FCDATA_DECL(FCDATA_IS_LINE_PARTICIPANT | FCDATA_IS_SVG_TEXT, NS_NewTextFrame); - if (ancestorFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(ancestorFrame)) { return &sSVGTextData; } } @@ -4052,7 +4053,7 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt maybeAbsoluteContainingBlockDisplay->IsRelativelyPositionedStyle() || maybeAbsoluteContainingBlockDisplay->IsFixedPosContainingBlock( maybeAbsoluteContainingBlockStyleFrame)) && - !maybeAbsoluteContainingBlockStyleFrame->IsSVGText()) { + !nsSVGUtils::IsInSVGTextSubtree(maybeAbsoluteContainingBlockStyleFrame)) { nsContainerFrame* cf = static_cast( maybeAbsoluteContainingBlock); aState.PushAbsoluteContainingBlock(cf, cf, absoluteSaveState); @@ -4975,7 +4976,7 @@ nsCSSFrameConstructor::ConstructNonScrollableBlockWithConstructor( aDisplay->IsFloatingStyle() || StyleDisplay::InlineBlock == aDisplay->mDisplay || clipPaginatedOverflow) && - !aParentFrame->IsSVGText()) { + !nsSVGUtils::IsInSVGTextSubtree(aParentFrame)) { flags = NS_BLOCK_FORMATTING_CONTEXT_STATE_BITS; if (clipPaginatedOverflow) { flags |= NS_BLOCK_CLIP_PAGINATED_OVERFLOW; @@ -5683,7 +5684,7 @@ nsCSSFrameConstructor::DoAddFrameConstructionItems(nsFrameConstructorState& aSta { uint32_t flags = ITEM_ALLOW_XBL_BASE | ITEM_ALLOW_PAGE_BREAK; if (aParentFrame) { - if (aParentFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aParentFrame)) { flags |= ITEM_IS_WITHIN_SVG_TEXT; } if (aParentFrame->GetType() == nsGkAtoms::blockFrame && @@ -11575,7 +11576,8 @@ nsCSSFrameConstructor::CreateLetterFrame(nsContainerFrame* aBlockFrame, // Create the right type of first-letter frame const nsStyleDisplay* display = sc->StyleDisplay(); - if (display->IsFloatingStyle() && !aParentFrame->IsSVGText()) { + if (display->IsFloatingStyle() && + !nsSVGUtils::IsInSVGTextSubtree(aParentFrame)) { // Make a floating first-letter frame CreateFloatingLetterFrame(state, aTextContent, textFrame, aParentFrame, sc, aResult); @@ -12149,7 +12151,7 @@ nsCSSFrameConstructor::ConstructInline(nsFrameConstructorState& aState, bool positioned = StyleDisplay::Inline == aDisplay->mDisplay && aDisplay->IsRelativelyPositionedStyle() && - !aParentFrame->IsSVGText(); + !nsSVGUtils::IsInSVGTextSubtree(aParentFrame); nsInlineFrame* newFrame = NS_NewInlineFrame(mPresShell, styleContext); diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 0fc08ecb0226c..da9191b5fb9c0 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -2415,7 +2415,7 @@ nsLayoutUtils::GetEventCoordinatesRelativeTo(nsIWidget* aWidget, /* If we encountered a transform, we can't do simple arithmetic to figure * out how to convert back to aFrame's coordinates and must use the CTM. */ - if (transformFound || aFrame->IsSVGText()) { + if (transformFound || nsSVGUtils::IsInSVGTextSubtree(aFrame)) { return TransformRootPointToFrame(aFrame, widgetToView); } @@ -3054,7 +3054,7 @@ TransformGfxRectToAncestor(nsIFrame *aFrame, static SVGTextFrame* GetContainingSVGTextFrame(nsIFrame* aFrame) { - if (!aFrame->IsSVGText()) { + if (!nsSVGUtils::IsInSVGTextSubtree(aFrame)) { return nullptr; } @@ -8107,7 +8107,7 @@ nsLayoutUtils::InflationMinFontSizeFor(const nsIFrame *aFrame) float nsLayoutUtils::FontSizeInflationFor(const nsIFrame *aFrame) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { const nsIFrame* container = aFrame; while (container->GetType() != nsGkAtoms::svgTextFrame) { container = container->GetParent(); diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp index b6d1c120482c8..77d3a2f6fd589 100644 --- a/layout/generic/ReflowInput.cpp +++ b/layout/generic/ReflowInput.cpp @@ -2535,7 +2535,7 @@ SizeComputationInput::InitOffsets(WritingMode aWM, ComputedPhysicalPadding().left = presContext->DevPixelsToAppUnits(widget.left); needPaddingProp = false; } - else if (mFrame->IsSVGText()) { + else if (nsSVGUtils::IsInSVGTextSubtree(mFrame)) { ComputedPhysicalPadding().SizeTo(0, 0, 0, 0); needPaddingProp = false; } @@ -2589,7 +2589,7 @@ SizeComputationInput::InitOffsets(WritingMode aWM, ComputedPhysicalBorderPadding().left = presContext->DevPixelsToAppUnits(widget.left); } - else if (mFrame->IsSVGText()) { + else if (nsSVGUtils::IsInSVGTextSubtree(mFrame)) { ComputedPhysicalBorderPadding().SizeTo(0, 0, 0, 0); } else if (aBorder) { // border is an input arg @@ -2868,7 +2868,7 @@ SizeComputationInput::ComputeMargin(WritingMode aWM, const LogicalSize& aPercentBasis) { // SVG text frames have no margin. - if (mFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(mFrame)) { return false; } diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp index 769be702a707f..f88069b3dc281 100644 --- a/layout/generic/nsBlockFrame.cpp +++ b/layout/generic/nsBlockFrame.cpp @@ -468,7 +468,7 @@ nsBlockFrame::GetType() const void nsBlockFrame::InvalidateFrame(uint32_t aDisplayItemKey) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { NS_ASSERTION(GetParent()->GetType() == nsGkAtoms::svgTextFrame, "unexpected block frame in SVG text"); GetParent()->InvalidateFrame(); @@ -480,7 +480,7 @@ nsBlockFrame::InvalidateFrame(uint32_t aDisplayItemKey) void nsBlockFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { NS_ASSERTION(GetParent()->GetType() == nsGkAtoms::svgTextFrame, "unexpected block frame in SVG text"); GetParent()->InvalidateFrame(); @@ -1917,7 +1917,7 @@ IsAlignedLeft(uint8_t aAlignment, uint8_t aUnicodeBidi, nsIFrame* aFrame) { - return aFrame->IsSVGText() || + return nsSVGUtils::IsInSVGTextSubtree(aFrame) || NS_STYLE_TEXT_ALIGN_LEFT == aAlignment || (((NS_STYLE_TEXT_ALIGN_START == aAlignment && NS_STYLE_DIRECTION_LTR == aDirection) || @@ -4599,7 +4599,7 @@ nsBlockFrame::PlaceLine(BlockReflowInput& aState, * In other words, isLastLine really means isLastLineAndWeCare. */ bool isLastLine = - !IsSVGText() && + !nsSVGUtils::IsInSVGTextSubtree(this) && ((NS_STYLE_TEXT_ALIGN_AUTO != styleText->mTextAlignLast || NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) && (aLineLayout.GetLineEndsInBR() || diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 7230c725cba63..4001b49737f24 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -873,7 +873,7 @@ AddAndRemoveImageAssociations(nsFrame* aFrame, /* virtual */ void nsFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { SVGTextFrame* svgTextFrame = static_cast( nsLayoutUtils::GetClosestFrameOfType(this, nsGkAtoms::svgTextFrame)); nsIFrame* anonBlock = svgTextFrame->PrincipalChildList().FirstChild(); @@ -1122,7 +1122,7 @@ nsIFrame::GetUsedMargin() const nsMargin margin(0, 0, 0, 0); if (((mState & NS_FRAME_FIRST_REFLOW) && !(mState & NS_FRAME_IN_REFLOW)) || - IsSVGText()) + nsSVGUtils::IsInSVGTextSubtree(this)) return margin; nsMargin *m = Properties().Get(UsedMarginProperty()); @@ -1144,7 +1144,7 @@ nsIFrame::GetUsedBorder() const nsMargin border(0, 0, 0, 0); if (((mState & NS_FRAME_FIRST_REFLOW) && !(mState & NS_FRAME_IN_REFLOW)) || - IsSVGText()) + nsSVGUtils::IsInSVGTextSubtree(this)) return border; // Theme methods don't use const-ness. @@ -1179,7 +1179,7 @@ nsIFrame::GetUsedPadding() const nsMargin padding(0, 0, 0, 0); if (((mState & NS_FRAME_FIRST_REFLOW) && !(mState & NS_FRAME_IN_REFLOW)) || - IsSVGText()) + nsSVGUtils::IsInSVGTextSubtree(this)) return padding; // Theme methods don't use const-ness. @@ -4387,7 +4387,7 @@ static FrameTarget GetSelectionClosestFrame(nsIFrame* aFrame, nsPoint aPoint, kid->FindCloserFrameForSelection(aPoint, &closest); } if (closest.mFrame) { - if (closest.mFrame->IsSVGText()) + if (nsSVGUtils::IsInSVGTextSubtree(closest.mFrame)) return FrameTarget(closest.mFrame, false, false); return GetSelectionClosestFrameForChild(closest.mFrame, aPoint, aFlags); } @@ -4518,7 +4518,7 @@ nsIFrame::ContentOffsets nsIFrame::GetContentOffsetsFromPoint(nsPoint aPoint, nsPoint pt; if (closest.frame != this) { - if (closest.frame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(closest.frame)) { pt = nsLayoutUtils::TransformAncestorPointToFrame(closest.frame, aPoint, this); } else { @@ -9538,7 +9538,7 @@ ConvertSVGDominantBaselineToVerticalAlign(uint8_t aDominantBaseline) uint8_t nsIFrame::VerticalAlignEnum() const { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { uint8_t dominantBaseline; for (const nsIFrame* frame = this; frame; frame = frame->GetParent()) { dominantBaseline = frame->StyleSVGReset()->mDominantBaseline; diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index f4f583ab917c9..a716601df3b9f 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -3530,8 +3530,6 @@ class nsIFrame : public nsQueryFrame uint8_t VerticalAlignEnum() const; enum { eInvalidVerticalAlign = 0xFF }; - bool IsSVGText() const { return mState & NS_FRAME_IS_SVG_TEXT; } - void CreateOwnLayerIfNeeded(nsDisplayListBuilder* aBuilder, nsDisplayList* aList); /** diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp index 872d75b7a2aba..0fb323d720289 100644 --- a/layout/generic/nsInlineFrame.cpp +++ b/layout/generic/nsInlineFrame.cpp @@ -65,7 +65,7 @@ nsInlineFrame::GetType() const void nsInlineFrame::InvalidateFrame(uint32_t aDisplayItemKey) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType(GetParent(), nsGkAtoms::svgTextFrame); @@ -78,7 +78,7 @@ nsInlineFrame::InvalidateFrame(uint32_t aDisplayItemKey) void nsInlineFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType(GetParent(), nsGkAtoms::svgTextFrame); @@ -487,7 +487,7 @@ nsInlineFrame::AttributeChanged(int32_t aNameSpaceID, return rv; } - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { SVGTextFrame* f = static_cast( nsLayoutUtils::GetClosestFrameOfType(this, nsGkAtoms::svgTextFrame)); f->HandleAttributeChangeInDescendant(mContent->AsElement(), diff --git a/layout/generic/nsLineLayout.cpp b/layout/generic/nsLineLayout.cpp index 7393da29ae9c9..b8da29d9ec6e3 100644 --- a/layout/generic/nsLineLayout.cpp +++ b/layout/generic/nsLineLayout.cpp @@ -79,7 +79,7 @@ nsLineLayout::nsLineLayout(nsPresContext* aPresContext, mDirtyNextLine(false), mLineAtStart(false), mHasRuby(false), - mSuppressLineWrap(aOuterReflowInput->mFrame->IsSVGText()) + mSuppressLineWrap(nsSVGUtils::IsInSVGTextSubtree(aOuterReflowInput->mFrame)) { MOZ_ASSERT(aOuterReflowInput, "aOuterReflowInput must not be null"); NS_ASSERTION(aFloatManager || aOuterReflowInput->mFrame->GetType() == @@ -1740,7 +1740,7 @@ static float GetInflationForBlockDirAlignment(nsIFrame* aFrame, nscoord aInflationMinFontSize) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { const nsIFrame* container = nsLayoutUtils::GetClosestFrameOfType(aFrame, nsGkAtoms::svgTextFrame); NS_ASSERTION(container, "expected to find an ancestor SVGTextFrame"); @@ -3140,7 +3140,7 @@ nsLineLayout::TextAlignLine(nsLineBox* aLine, } } - bool isSVG = mBlockReflowInput->mFrame->IsSVGText(); + bool isSVG = nsSVGUtils::IsInSVGTextSubtree(mBlockReflowInput->mFrame); bool doTextAlign = remainingISize > 0 || textAlignTrue; int32_t additionalGaps = 0; diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index aad044f0edbd1..e1d016fdcab51 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -335,14 +335,14 @@ class nsTextPaintStyle { // SVG text has its own painting process, so we should never get its stroke // property from here. nscolor GetWebkitTextStrokeColor() { - if (mFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(mFrame)) { return 0; } return mFrame->StyleColor()-> CalcComplexColor(mFrame->StyleText()->mWebkitTextStrokeColor); } float GetWebkitTextStrokeWidth() { - if (mFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(mFrame)) { return 0.0f; } nscoord coord = mFrame->StyleText()->mWebkitTextStrokeWidth; @@ -683,7 +683,8 @@ InvalidateFrameDueToGlyphsChanged(nsIFrame* aFrame) // to reflow the SVGTextFrame. (This is similar to reflowing the // SVGTextFrame in response to style changes, in // SVGTextFrame::DidSetStyleContext.) - if (f->IsSVGText() && f->GetStateBits() & NS_FRAME_IS_NONDISPLAY) { + if (nsSVGUtils::IsInSVGTextSubtree(f) && + f->GetStateBits() & NS_FRAME_IS_NONDISPLAY) { auto svgTextFrame = static_cast( nsLayoutUtils::GetClosestFrameOfType(f, nsGkAtoms::svgTextFrame)); @@ -1725,7 +1726,7 @@ GetSpaceWidthAppUnits(const gfxTextRun* aTextRun) static nscoord LetterSpacing(nsIFrame* aFrame, const nsStyleText* aStyleText = nullptr) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { return 0; } if (!aStyleText) { @@ -1744,7 +1745,7 @@ static nscoord WordSpacing(nsIFrame* aFrame, const gfxTextRun* aTextRun, const nsStyleText* aStyleText = nullptr) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { return 0; } if (!aStyleText) { @@ -1764,7 +1765,7 @@ WordSpacing(nsIFrame* aFrame, const gfxTextRun* aTextRun, static uint32_t GetSpacingFlags(nsIFrame* aFrame, const nsStyleText* aStyleText = nullptr) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { return 0; } @@ -2060,7 +2061,7 @@ BuildTextRunsScanner::BuildTextRunForFrames(void* aTextBuffer) uint32_t nextBreakIndex = 0; nsTextFrame* nextBreakBeforeFrame = GetNextBreakBeforeFrame(&nextBreakIndex); - bool isSVG = mLineContainer->IsSVGText(); + bool isSVG = nsSVGUtils::IsInSVGTextSubtree(mLineContainer); bool enabledJustification = (mLineContainer->StyleText()->mTextAlign == NS_STYLE_TEXT_ALIGN_JUSTIFY || mLineContainer->StyleText()->mTextAlignLast == NS_STYLE_TEXT_ALIGN_JUSTIFY); @@ -3787,7 +3788,7 @@ nsTextPaintStyle::EnsureSufficientContrast(nscolor *aForeColor, nscolor *aBackCo nscolor nsTextPaintStyle::GetTextColor() { - if (mFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(mFrame)) { if (!mResolveColors) return NS_SAME_AS_FOREGROUND_COLOR; @@ -4033,12 +4034,12 @@ nsTextPaintStyle::InitSelectionColorsAndShadow() if (mResolveColors) { // On MacOS X, we don't exchange text color and BG color. if (mSelectionTextColor == NS_DONT_CHANGE_COLOR) { - nscolor frameColor = mFrame->IsSVGText() + nscolor frameColor = nsSVGUtils::IsInSVGTextSubtree(mFrame) ? mFrame->GetVisitedDependentColor(&nsStyleSVG::mFill) : mFrame->GetVisitedDependentColor(&nsStyleText::mWebkitTextFillColor); mSelectionTextColor = EnsureDifferentColors(frameColor, mSelectionBGColor); } else if (mSelectionTextColor == NS_CHANGE_COLOR_IF_SAME_AS_BG) { - nscolor frameColor = mFrame->IsSVGText() + nscolor frameColor = nsSVGUtils::IsInSVGTextSubtree(mFrame) ? mFrame->GetVisitedDependentColor(&nsStyleSVG::mFill) : mFrame->GetVisitedDependentColor(&nsStyleText::mWebkitTextFillColor); if (frameColor == mSelectionBGColor) { @@ -4604,7 +4605,7 @@ nsTextFrame::LastContinuation() const void nsTextFrame::InvalidateFrame(uint32_t aDisplayItemKey) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType(GetParent(), nsGkAtoms::svgTextFrame); @@ -4617,7 +4618,7 @@ nsTextFrame::InvalidateFrame(uint32_t aDisplayItemKey) void nsTextFrame::InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey) { - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { nsIFrame* svgTextFrame = nsLayoutUtils::GetClosestFrameOfType(GetParent(), nsGkAtoms::svgTextFrame); @@ -5166,7 +5167,7 @@ nsTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, Maybe isSelected; if (((GetStateBits() & TEXT_NO_RENDERED_GLYPHS) || (isTextTransparent && !StyleText()->HasTextShadow())) && - aBuilder->IsForPainting() && !IsSVGText()) { + aBuilder->IsForPainting() && !nsSVGUtils::IsInSVGTextSubtree(this)) { isSelected.emplace(IsSelected()); if (!isSelected.value()) { TextDecorations textDecs; @@ -5385,7 +5386,7 @@ nsTextFrame::GetTextDecorations( nscolor color; if (useOverride) { color = overrideColor; - } else if (IsSVGText()) { + } else if (nsSVGUtils::IsInSVGTextSubtree(this)) { // XXX We might want to do something with text-decoration-color when // painting SVG text, but it's not clear what we should do. We // at least need SVG text decorations to paint with 'fill' if @@ -5458,7 +5459,7 @@ nsTextFrame::GetTextDecorations( static float GetInflationForTextDecorations(nsIFrame* aFrame, nscoord aInflationMinFontSize) { - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { const nsIFrame* container = aFrame; while (container->GetType() != nsGkAtoms::svgTextFrame) { container = container->GetParent(); @@ -6643,7 +6644,7 @@ nsTextFrame::GetCaretColorAt(int32_t aOffset) } bool isSolidTextColor = true; - if (IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(this)) { const nsStyleSVG* style = StyleSVG(); if (style->mFill.Type() != eStyleSVGPaintType_None && style->mFill.Type() != eStyleSVGPaintType_Color) { @@ -9610,7 +9611,7 @@ nsTextFrame::ReflowText(nsLineLayout& aLineLayout, nscoord aAvailableWidth, (lineContainer->StyleText()->mTextAlign == NS_STYLE_TEXT_ALIGN_JUSTIFY || lineContainer->StyleText()->mTextAlignLast == NS_STYLE_TEXT_ALIGN_JUSTIFY || shouldSuppressLineBreak) && - !lineContainer->IsSVGText()) { + !nsSVGUtils::IsInSVGTextSubtree(lineContainer)) { AddStateBits(TEXT_JUSTIFICATION_ENABLED); Range range(uint32_t(offset), uint32_t(offset + charsFit)); aLineLayout.SetJustificationInfo(provider.ComputeJustification(range)); diff --git a/layout/style/nsFontFaceUtils.cpp b/layout/style/nsFontFaceUtils.cpp index 0d61d1ea7cf1b..fbb31daa57742 100644 --- a/layout/style/nsFontFaceUtils.cpp +++ b/layout/style/nsFontFaceUtils.cpp @@ -71,7 +71,7 @@ static void ScheduleReflow(nsIPresShell* aShell, nsIFrame* aFrame) { nsIFrame* f = aFrame; - if (f->IsFrameOfType(nsIFrame::eSVG) || f->IsSVGText()) { + if (f->IsFrameOfType(nsIFrame::eSVG) || nsSVGUtils::IsInSVGTextSubtree(f)) { // SVG frames (and the non-SVG descendants of an SVGTextFrame) need special // reflow handling. We need to search upwards for the first displayed // nsSVGOuterSVGFrame or non-SVG frame, which is the frame we can call @@ -88,7 +88,8 @@ ScheduleReflow(nsIPresShell* aShell, nsIFrame* aFrame) return; } if (f->GetStateBits() & NS_STATE_IS_OUTER_SVG || - !(f->IsFrameOfType(nsIFrame::eSVG) || f->IsSVGText())) { + !(f->IsFrameOfType(nsIFrame::eSVG) || + nsSVGUtils::IsInSVGTextSubtree(f))) { break; } f->AddStateBits(NS_FRAME_HAS_DIRTY_CHILDREN); diff --git a/layout/style/nsStyleStructInlines.h b/layout/style/nsStyleStructInlines.h index 7144912a5ad29..1c60190f8a3de 100644 --- a/layout/style/nsStyleStructInlines.h +++ b/layout/style/nsStyleStructInlines.h @@ -15,7 +15,7 @@ #include "nsStyleStruct.h" #include "nsIContent.h" // for GetParent() #include "nsTextFrame.h" // for nsTextFrame::ShouldSuppressLineBreak - +#include "nsSVGUtils.h" // for nsSVGUtils::IsInSVGTextSubtree #include "mozilla/ServoStyleSet.h" inline void @@ -65,7 +65,8 @@ bool nsStyleText::WhiteSpaceCanWrap(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); - return WhiteSpaceCanWrapStyle() && !aContextFrame->IsSVGText() && + return WhiteSpaceCanWrapStyle() && + !nsSVGUtils::IsInSVGTextSubtree(aContextFrame) && !aContextFrame->StyleContext()->IsTextCombined(); } @@ -73,14 +74,14 @@ bool nsStyleText::WordCanWrap(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleText() == this, "unexpected aContextFrame"); - return WordCanWrapStyle() && !aContextFrame->IsSVGText(); + return WordCanWrapStyle() && !nsSVGUtils::IsInSVGTextSubtree(aContextFrame); } bool nsStyleDisplay::IsBlockInside(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (aContextFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aContextFrame)) { return aContextFrame->GetType() == nsGkAtoms::blockFrame; } return IsBlockInsideStyle(); @@ -90,7 +91,7 @@ bool nsStyleDisplay::IsBlockOutside(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (aContextFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aContextFrame)) { return aContextFrame->GetType() == nsGkAtoms::blockFrame; } return IsBlockOutsideStyle(); @@ -100,7 +101,7 @@ bool nsStyleDisplay::IsInlineOutside(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (aContextFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aContextFrame)) { return aContextFrame->GetType() != nsGkAtoms::blockFrame; } return IsInlineOutsideStyle(); @@ -110,7 +111,7 @@ bool nsStyleDisplay::IsOriginalDisplayInlineOutside(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (aContextFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aContextFrame)) { return aContextFrame->GetType() != nsGkAtoms::blockFrame; } return IsOriginalDisplayInlineOutsideStyle(); @@ -120,7 +121,8 @@ mozilla::StyleDisplay nsStyleDisplay::GetDisplay(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - if (aContextFrame->IsSVGText() && mDisplay != mozilla::StyleDisplay::None) { + if (nsSVGUtils::IsInSVGTextSubtree(aContextFrame) && + mDisplay != mozilla::StyleDisplay::None) { return aContextFrame->GetType() == nsGkAtoms::blockFrame ? mozilla::StyleDisplay::Block : mozilla::StyleDisplay::Inline; } @@ -131,7 +133,7 @@ bool nsStyleDisplay::IsFloating(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsFloatingStyle() && !aContextFrame->IsSVGText(); + return IsFloatingStyle() && !nsSVGUtils::IsInSVGTextSubtree(aContextFrame); } // If you change this function, also change the corresponding block in @@ -185,7 +187,7 @@ nsStyleDisplay::IsFixedPosContainingBlock(const nsIFrame* aContextFrame) const !HasTransform(aContextFrame)) { return false; } - return !aContextFrame->IsSVGText(); + return !nsSVGUtils::IsInSVGTextSubtree(aContextFrame); } template @@ -223,21 +225,23 @@ nsStyleDisplay::IsAbsPosContainingBlock(const nsIFrame* aContextFrame) const !HasTransform(aContextFrame)) { return false; } - return !aContextFrame->IsSVGText(); + return !nsSVGUtils::IsInSVGTextSubtree(aContextFrame); } bool nsStyleDisplay::IsRelativelyPositioned(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsRelativelyPositionedStyle() && !aContextFrame->IsSVGText(); + return IsRelativelyPositionedStyle() && + !nsSVGUtils::IsInSVGTextSubtree(aContextFrame); } bool nsStyleDisplay::IsAbsolutelyPositioned(const nsIFrame* aContextFrame) const { NS_ASSERTION(aContextFrame->StyleDisplay() == this, "unexpected aContextFrame"); - return IsAbsolutelyPositionedStyle() && !aContextFrame->IsSVGText(); + return IsAbsolutelyPositionedStyle() && + !nsSVGUtils::IsInSVGTextSubtree(aContextFrame); } uint8_t diff --git a/layout/svg/nsSVGEffects.cpp b/layout/svg/nsSVGEffects.cpp index 6a931f62498b6..ff2310c105167 100644 --- a/layout/svg/nsSVGEffects.cpp +++ b/layout/svg/nsSVGEffects.cpp @@ -418,7 +418,8 @@ nsSVGTextPathProperty::DoUpdate() if (!frame) return; - NS_ASSERTION(frame->IsFrameOfType(nsIFrame::eSVG) || frame->IsSVGText(), + NS_ASSERTION(frame->IsFrameOfType(nsIFrame::eSVG) || + nsSVGUtils::IsInSVGTextSubtree(frame), "SVG frame expected"); // Avoid getting into an infinite loop of reflows if the is diff --git a/layout/svg/nsSVGUtils.cpp b/layout/svg/nsSVGUtils.cpp index 272f949917be2..dcf150278f969 100644 --- a/layout/svg/nsSVGUtils.cpp +++ b/layout/svg/nsSVGUtils.cpp @@ -433,15 +433,16 @@ nsSVGUtils::GetUserToCanvasTM(nsIFrame *aFrame) return tm; } -void +void nsSVGUtils::NotifyChildrenOfSVGChange(nsIFrame *aFrame, uint32_t aFlags) { for (nsIFrame* kid : aFrame->PrincipalChildList()) { nsSVGDisplayableFrame* SVGFrame = do_QueryFrame(kid); if (SVGFrame) { - SVGFrame->NotifySVGChanged(aFlags); + SVGFrame->NotifySVGChanged(aFlags); } else { - NS_ASSERTION(kid->IsFrameOfType(nsIFrame::eSVG) || kid->IsSVGText(), + NS_ASSERTION(kid->IsFrameOfType(nsIFrame::eSVG) || + nsSVGUtils::IsInSVGTextSubtree(kid), "SVG frame expected"); // recurse into the children of container frames e.g. , // in case they have child frames with transformation matrices @@ -632,7 +633,7 @@ class MixModeBlender { mSourceCtx->Multiply(aTransform); nsRect overflowRect = mFrame->GetVisualOverflowRectRelativeToSelf(); if (mFrame->IsFrameOfType(nsIFrame::eSVGGeometry) || - mFrame->IsSVGText()) { + nsSVGUtils::IsInSVGTextSubtree(mFrame)) { // Unlike containers, leaf frames do not include GetPosition() in // GetCanvasTM(). overflowRect = overflowRect + mFrame->GetPosition(); @@ -695,7 +696,7 @@ nsSVGUtils::PaintFrameWithEffects(nsIFrame *aFrame, // SVG doesn't maintain bounds/overflow rects. nsRect overflowRect = aFrame->GetVisualOverflowRectRelativeToSelf(); if (aFrame->IsFrameOfType(nsIFrame::eSVGGeometry) || - aFrame->IsSVGText()) { + nsSVGUtils::IsInSVGTextSubtree(aFrame)) { // Unlike containers, leaf frames do not include GetPosition() in // GetCanvasTM(). overflowRect = overflowRect + aFrame->GetPosition(); @@ -1105,13 +1106,13 @@ nsSVGUtils::GetBBox(nsIFrame *aFrame, uint32_t aFlags) aFrame = aFrame->GetParent(); } - if (aFrame->IsSVGText()) { + if (nsSVGUtils::IsInSVGTextSubtree(aFrame)) { // It is possible to apply a gradient, pattern, clipping path, mask or // filter to text. When one of these facilities is applied to text // the bounding box is the entire text element in all // cases. nsIFrame* ancestor = GetFirstNonAAncestorFrame(aFrame); - if (ancestor && ancestor->IsSVGText()) { + if (ancestor && nsSVGUtils::IsInSVGTextSubtree(ancestor)) { while (ancestor->GetType() != nsGkAtoms::svgTextFrame) { ancestor = ancestor->GetParent(); } @@ -1238,7 +1239,7 @@ nsSVGUtils::FrameSpaceInCSSPxToUserSpaceOffset(nsIFrame *aFrame) // Leaf frames apply their own offset inside their user space. if (aFrame->IsFrameOfType(nsIFrame::eSVGGeometry) || - aFrame->IsSVGText()) { + nsSVGUtils::IsInSVGTextSubtree(aFrame)) { return nsLayoutUtils::RectToGfxRect(aFrame->GetRect(), nsPresContext::AppUnitsPerCSSPixel()).TopLeft(); } @@ -1402,7 +1403,8 @@ nsSVGUtils::PathExtentsToMaxStrokeExtents(const gfxRect& aPathExtents, nsTextFrame* aFrame, const gfxMatrix& aMatrix) { - NS_ASSERTION(aFrame->IsSVGText(), "expected an nsTextFrame for SVG text"); + NS_ASSERTION(nsSVGUtils::IsInSVGTextSubtree(aFrame), + "expected an nsTextFrame for SVG text"); return ::PathExtentsToMaxStrokeExtents(aPathExtents, aFrame, 0.5, aMatrix); } diff --git a/layout/svg/nsSVGUtils.h b/layout/svg/nsSVGUtils.h index 5108a6d80a004..068ca0b8d99d1 100644 --- a/layout/svg/nsSVGUtils.h +++ b/layout/svg/nsSVGUtils.h @@ -609,6 +609,11 @@ class nsSVGUtils */ static gfxMatrix GetCSSPxToDevPxMatrix(nsIFrame* aNonSVGFrame); + + static bool IsInSVGTextSubtree(const nsIFrame* aFrame) { + // Returns true if the frame is an SVGTextFrame or one of its descendants. + return aFrame->GetStateBits() & NS_FRAME_IS_SVG_TEXT; + } }; #endif From affdf632d56e14ca3e6d06d1379e11bd260f09c2 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 08:45:41 +0100 Subject: [PATCH 286/300] Backed out changeset 3ccb231829a9 (bug 1349690) --- dom/base/ScriptSettings.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/dom/base/ScriptSettings.cpp b/dom/base/ScriptSettings.cpp index c9fa9e1f2ba91..a89b3419127a2 100644 --- a/dom/base/ScriptSettings.cpp +++ b/dom/base/ScriptSettings.cpp @@ -376,13 +376,6 @@ AutoJSAPI::InitInternal(nsIGlobalObject* aGlobalObject, JSObject* aGlobal, if (exn.isObject()) { JS::Rooted exnObj(aCx, &exn.toObject()); - // Make sure we can actually read things from it. This UncheckedUwrap is - // safe because we're only getting data for a debug printf. In - // particular, we do not expose this data to anyone, which is very - // important; otherwise it could be a cross-origin information leak. - exnObj = js::UncheckedUwrap(exnObj); - JSAutoCompartment ac(aCx, exnObj); - nsAutoJSString stack, filename, name, message; int32_t line; From 380ec18b82ec32788c8a548598ce112be2909a4b Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 08:45:45 +0100 Subject: [PATCH 287/300] Backed out changeset 8ba41a1bd062 (bug 1348095) --- js/xpconnect/wrappers/XrayWrapper.cpp | 33 ++++++--------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 45eb0ffa95c92..42a4a4ddc3d8f 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -2410,35 +2410,16 @@ XrayWrapper::getPrototype(JSContext* cx, JS::HandleObject wrapper, // only if there's been a set. If there's not an expando, or the expando // slot is |undefined|, hand back the default proto, appropriately wrapped. + RootedValue v(cx); if (expando) { - RootedValue v(cx); - { // Scope for JSAutoCompartment - JSAutoCompartment ac(cx, expando); - v = JS_GetReservedSlot(expando, JSSLOT_EXPANDO_PROTOTYPE); - } - if (!v.isUndefined()) { - protop.set(v.toObjectOrNull()); - return JS_WrapObject(cx, protop); - } + JSAutoCompartment ac(cx, expando); + v = JS_GetReservedSlot(expando, JSSLOT_EXPANDO_PROTOTYPE); } + if (v.isUndefined()) + return getPrototypeHelper(cx, wrapper, target, protop); - // Check our holder, and cache there if we don't have it cached already. - RootedObject holder(cx, Traits::singleton.ensureHolder(cx, wrapper)); - if (!holder) - return false; - - Value cached = js::GetReservedSlot(holder, - Traits::HOLDER_SLOT_CACHED_PROTO); - if (cached.isUndefined()) { - if (!getPrototypeHelper(cx, wrapper, target, protop)) - return false; - - js::SetReservedSlot(holder, Traits::HOLDER_SLOT_CACHED_PROTO, - ObjectOrNullValue(protop)); - } else { - protop.set(cached.toObjectOrNull()); - } - return true; + protop.set(v.toObjectOrNull()); + return JS_WrapObject(cx, protop); } template From 604012c68ce5f2a3bd6336c19d332100aa2dcd2e Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 08:45:48 +0100 Subject: [PATCH 288/300] Backed out changeset 3efe3c6f4e7f (bug 1348095) --- js/xpconnect/wrappers/XrayWrapper.cpp | 7 ++----- js/xpconnect/wrappers/XrayWrapper.h | 12 ++---------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 42a4a4ddc3d8f..6d4d565e059f3 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -201,12 +201,9 @@ XPCWrappedNativeXrayTraits::getWN(JSObject* wrapper) } const JSClass XPCWrappedNativeXrayTraits::HolderClass = { - "NativePropertyHolder", JSCLASS_HAS_RESERVED_SLOTS(HOLDER_SHARED_SLOT_COUNT) + "NativePropertyHolder" }; -const JSClass XrayTraits::HolderClass = { - "XrayHolder", JSCLASS_HAS_RESERVED_SLOTS(HOLDER_SHARED_SLOT_COUNT) -}; const JSClass JSXrayTraits::HolderClass = { "JSXrayHolder", JSCLASS_HAS_RESERVED_SLOTS(SLOT_COUNT) @@ -1857,7 +1854,7 @@ DOMXrayTraits::preserveWrapper(JSObject* target) JSObject* DOMXrayTraits::createHolder(JSContext* cx, JSObject* wrapper) { - return JS_NewObjectWithGivenProto(cx, &HolderClass, nullptr); + return JS_NewObjectWithGivenProto(cx, nullptr, nullptr); } const JSClass* diff --git a/js/xpconnect/wrappers/XrayWrapper.h b/js/xpconnect/wrappers/XrayWrapper.h index 4527e3b0a1f0f..5630982c28c41 100644 --- a/js/xpconnect/wrappers/XrayWrapper.h +++ b/js/xpconnect/wrappers/XrayWrapper.h @@ -99,12 +99,6 @@ class XrayTraits JSObject* ensureExpandoObject(JSContext* cx, JS::HandleObject wrapper, JS::HandleObject target); - // Slots for holder objects. - enum { - HOLDER_SLOT_CACHED_PROTO = 0, - HOLDER_SHARED_SLOT_COUNT - }; - JSObject* getHolder(JSObject* wrapper); JSObject* ensureHolder(JSContext* cx, JS::HandleObject wrapper); virtual JSObject* createHolder(JSContext* cx, JSObject* wrapper) = 0; @@ -114,8 +108,6 @@ class XrayTraits bool cloneExpandoChain(JSContext* cx, JS::HandleObject dst, JS::HandleObject src); protected: - static const JSClass HolderClass; - // Get the JSClass we should use for our expando object. virtual const JSClass* getExpandoClass(JSContext* cx, JS::HandleObject target) const; @@ -309,7 +301,7 @@ class JSXrayTraits : public XrayTraits } enum { - SLOT_PROTOKEY = HOLDER_SHARED_SLOT_COUNT, + SLOT_PROTOKEY = 0, SLOT_ISPROTOTYPE, SLOT_CONSTRUCTOR_FOR, SLOT_COUNT @@ -429,7 +421,7 @@ class OpaqueXrayTraits : public XrayTraits virtual JSObject* createHolder(JSContext* cx, JSObject* wrapper) override { - return JS_NewObjectWithGivenProto(cx, &HolderClass, nullptr); + return JS_NewObjectWithGivenProto(cx, nullptr, nullptr); } static OpaqueXrayTraits singleton; From 8db36fe93f44b056dd094a70aef639ec324ce160 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 08:46:07 +0100 Subject: [PATCH 289/300] Backed out changeset 60471d1feaa4 (bug 1348095) for bustage --- js/xpconnect/wrappers/XrayWrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 6d4d565e059f3..0daf207897f04 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -201,7 +201,7 @@ XPCWrappedNativeXrayTraits::getWN(JSObject* wrapper) } const JSClass XPCWrappedNativeXrayTraits::HolderClass = { - "NativePropertyHolder" + "NativePropertyHolder", JSCLASS_HAS_RESERVED_SLOTS(2) }; From d228c014d35b9faa0e5f45355b2f48b835cf1db3 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 08:50:13 +0100 Subject: [PATCH 290/300] Backed out changeset aa77848f51ee (bug 1349572) for test failures in test_fileReadSlice.xul and others --- dom/workers/FileReaderSync.cpp | 46 +++++++++------------------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/dom/workers/FileReaderSync.cpp b/dom/workers/FileReaderSync.cpp index 3d855aef9fd0e..18efcb194c71c 100644 --- a/dom/workers/FileReaderSync.cpp +++ b/dom/workers/FileReaderSync.cpp @@ -20,8 +20,7 @@ #include "nsError.h" #include "nsIConverterInputStream.h" #include "nsIInputStream.h" -#include "nsIMultiplexInputStream.h" -#include "nsStringStream.h" +#include "nsISeekableStream.h" #include "nsISupportsImpl.h" #include "nsNetUtil.h" #include "nsServiceManagerUtils.h" @@ -134,23 +133,17 @@ FileReaderSync::ReadAsText(Blob& aBlob, } nsAutoCString encoding; - - nsAutoCString sniffBuf; - if (!sniffBuf.SetLength(3, fallible)) { - aRv.Throw(NS_ERROR_OUT_OF_MEMORY); - return; - } - - uint32_t numRead = 0; - aRv = stream->Read(sniffBuf.BeginWriting(), sniffBuf.Length(), &numRead); + unsigned char sniffBuf[3] = { 0, 0, 0 }; + uint32_t numRead; + aRv = stream->Read(reinterpret_cast(sniffBuf), + sizeof(sniffBuf), &numRead); if (NS_WARN_IF(aRv.Failed())) { return; } // The BOM sniffing is baked into the "decode" part of the Encoding // Standard, which the File API references. - if (!nsContentUtils::CheckForBOM((const unsigned char*)sniffBuf.BeginReading(), - numRead, encoding)) { + if (!nsContentUtils::CheckForBOM(sniffBuf, numRead, encoding)) { // BOM sniffing failed. Try the API argument. if (!aEncoding.WasPassed() || !EncodingUtils::FindEncodingForLabel(aEncoding.Value(), @@ -174,35 +167,20 @@ FileReaderSync::ReadAsText(Blob& aBlob, } } - // Let's recreate the full stream using a: - // multiplexStream(stringStream + original stream) - // In theory, we could try to see if the inputStream is a nsISeekableStream, - // but this doesn't work correctly for nsPipe3 - See bug 1349570. - - nsCOMPtr stringStream; - aRv = NS_NewCStringInputStream(getter_AddRefs(stringStream), sniffBuf); - if (NS_WARN_IF(aRv.Failed())) { - return; - } - - nsCOMPtr multiplexStream = - do_CreateInstance("@mozilla.org/io/multiplex-input-stream;1"); - if (NS_WARN_IF(!multiplexStream)) { + nsCOMPtr seekable = do_QueryInterface(stream); + if (!seekable) { aRv.Throw(NS_ERROR_FAILURE); return; } - aRv = multiplexStream->AppendStream(stringStream); - if (NS_WARN_IF(aRv.Failed())) { - return; - } - - aRv = multiplexStream->AppendStream(stream); + // Seek to 0 because to undo the BOM sniffing advance. UTF-8 and UTF-16 + // decoders will swallow the BOM. + aRv = seekable->Seek(nsISeekableStream::NS_SEEK_SET, 0); if (NS_WARN_IF(aRv.Failed())) { return; } - aRv = ConvertStream(multiplexStream, encoding.get(), aResult); + aRv = ConvertStream(stream, encoding.get(), aResult); if (NS_WARN_IF(aRv.Failed())) { return; } From 14da7a488ae3aee87d3a5e7798e6ce39d3660b67 Mon Sep 17 00:00:00 2001 From: cku Date: Thu, 23 Mar 2017 16:53:47 +0800 Subject: [PATCH 291/300] Bug 1349462 - Part 2. one line for static function. r=jwatt MozReview-Commit-ID: 9jVkHtLouVN --- layout/svg/nsSVGUtils.h | 106 ++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 59 deletions(-) diff --git a/layout/svg/nsSVGUtils.h b/layout/svg/nsSVGUtils.h index 068ca0b8d99d1..a8ab54d38fc0e 100644 --- a/layout/svg/nsSVGUtils.h +++ b/layout/svg/nsSVGUtils.h @@ -267,42 +267,41 @@ class nsSVGUtils Input: content - object to be used for determining user space Input: length - length to be converted */ - static float UserSpace(nsSVGElement *aSVGElement, const nsSVGLength2 *aLength); + static float UserSpace(nsSVGElement *aSVGElement, + const nsSVGLength2 *aLength); static float UserSpace(nsIFrame *aFrame, const nsSVGLength2 *aLength); - static float UserSpace(const mozilla::dom::UserSpaceMetrics& aMetrics, const nsSVGLength2 *aLength); + static float UserSpace(const mozilla::dom::UserSpaceMetrics& aMetrics, + const nsSVGLength2 *aLength); /* Find the outermost SVG frame of the passed frame */ - static nsSVGOuterSVGFrame * - GetOuterSVGFrame(nsIFrame *aFrame); + static nsSVGOuterSVGFrame* GetOuterSVGFrame(nsIFrame *aFrame); /** * Get the covered region for a frame. Return null if it's not an SVG frame. * @param aRect gets a rectangle in app units * @return the outer SVG frame which aRect is relative to */ - static nsIFrame* - GetOuterSVGFrameAndCoveredRegion(nsIFrame* aFrame, nsRect* aRect); + static nsIFrame* GetOuterSVGFrameAndCoveredRegion(nsIFrame* aFrame, + nsRect* aRect); /* Paint SVG frame with SVG effects - aDirtyRect is the area being * redrawn, in device pixel coordinates relative to the outer svg */ - static DrawResult - PaintFrameWithEffects(nsIFrame *aFrame, - gfxContext& aContext, - const gfxMatrix& aTransform, - const nsIntRect *aDirtyRect = nullptr); + static DrawResult PaintFrameWithEffects(nsIFrame *aFrame, + gfxContext& aContext, + const gfxMatrix& aTransform, + const nsIntRect *aDirtyRect = nullptr); /* Hit testing - check if point hits the clipPath of indicated * frame. Returns true if no clipPath set. */ - static bool - HitTestClip(nsIFrame *aFrame, const gfxPoint &aPoint); - + static bool HitTestClip(nsIFrame *aFrame, const gfxPoint &aPoint); + /** * Hit testing - check if point hits any children of aFrame. aPoint is * expected to be in the coordinate space established by aFrame for its * children (e.g. the space established by the 'viewBox' attribute on ). */ - static nsIFrame * - HitTestChildren(nsSVGDisplayContainerFrame *aFrame, const gfxPoint &aPoint); + static nsIFrame* HitTestChildren(nsSVGDisplayContainerFrame *aFrame, + const gfxPoint &aPoint); /* * Returns the CanvasTM of the indicated frame, whether it's a @@ -326,19 +325,16 @@ class nsSVGUtils * Notify the descendants of aFrame of a change to one of their ancestors * that might affect them. */ - static void - NotifyChildrenOfSVGChange(nsIFrame *aFrame, uint32_t aFlags); + static void NotifyChildrenOfSVGChange(nsIFrame *aFrame, uint32_t aFlags); /* * Get frame's covered region by walking the children and doing union. */ - static nsRect - GetCoveredRegion(const nsFrameList &aFrames); + static nsRect GetCoveredRegion(const nsFrameList &aFrames); - static nsRect - TransformFrameRectToOuterSVG(const nsRect& aRect, - const gfxMatrix& aMatrix, - nsPresContext* aPresContext); + static nsRect TransformFrameRectToOuterSVG(const nsRect& aRect, + const gfxMatrix& aMatrix, + nsPresContext* aPresContext); /* * Convert a surface size to an integer for use by thebes @@ -355,10 +351,9 @@ class nsSVGUtils /* * Hit test a given rectangle/matrix. */ - static bool - HitTestRect(const mozilla::gfx::Matrix &aMatrix, - float aRX, float aRY, float aRWidth, float aRHeight, - float aX, float aY); + static bool HitTestRect(const mozilla::gfx::Matrix &aMatrix, + float aRX, float aRY, float aRWidth, float aRHeight, + float aX, float aY); /** @@ -368,9 +363,9 @@ class nsSVGUtils * The arguments for aX, aY, aWidth and aHeight should be the dimensions of * the viewport established by aFrame. */ - static gfxRect - GetClipRectForFrame(nsIFrame *aFrame, - float aX, float aY, float aWidth, float aHeight); + static gfxRect GetClipRectForFrame(nsIFrame *aFrame, + float aX, float aY, float aWidth, + float aHeight); static void SetClipRect(gfxContext *aContext, const gfxMatrix &aCTM, @@ -381,8 +376,7 @@ class nsSVGUtils * not applying filters and not both stroking and filling, we can * generate the same result without going through the overhead of a * push/pop group. */ - static bool - CanOptimizeOpacity(nsIFrame *aFrame); + static bool CanOptimizeOpacity(nsIFrame *aFrame); /** * Take the CTM to userspace for an element, and adjust it to a CTM to its @@ -392,10 +386,9 @@ class nsSVGUtils * * If the bbox is empty, this will return a singular matrix. */ - static gfxMatrix - AdjustMatrixForUnits(const gfxMatrix &aMatrix, - nsSVGEnum *aUnits, - nsIFrame *aFrame); + static gfxMatrix AdjustMatrixForUnits(const gfxMatrix &aMatrix, + nsSVGEnum *aUnits, + nsIFrame *aFrame); enum BBoxFlags { eBBoxIncludeFill = 1 << 0, @@ -439,14 +432,12 @@ class nsSVGUtils * @param aFrame the object in which to interpret user-space units; * may be null if aUnits is SVG_UNIT_TYPE_OBJECTBOUNDINGBOX */ - static gfxRect - GetRelativeRect(uint16_t aUnits, const nsSVGLength2 *aXYWH, - const gfxRect& aBBox, nsIFrame *aFrame); + static gfxRect GetRelativeRect(uint16_t aUnits, const nsSVGLength2 *aXYWH, + const gfxRect& aBBox, nsIFrame *aFrame); - static gfxRect - GetRelativeRect(uint16_t aUnits, const nsSVGLength2 *aXYWH, - const gfxRect& aBBox, - const mozilla::dom::UserSpaceMetrics& aMetrics); + static gfxRect GetRelativeRect(uint16_t aUnits, const nsSVGLength2 *aXYWH, + const gfxRect& aBBox, + const mozilla::dom::UserSpaceMetrics& aMetrics); /** * Find the first frame, starting with aStartFrame and going up its @@ -503,11 +494,10 @@ class nsSVGUtils static nscolor GetFallbackOrPaintColor(nsStyleContext *aStyleContext, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke); - static void - MakeFillPatternFor(nsIFrame *aFrame, - gfxContext* aContext, - GeneralPattern* aOutPattern, - SVGContextPaint* aContextPaint = nullptr); + static void MakeFillPatternFor(nsIFrame *aFrame, + gfxContext* aContext, + GeneralPattern* aOutPattern, + SVGContextPaint* aContextPaint = nullptr); static void MakeStrokePatternFor(nsIFrame* aFrame, @@ -560,6 +550,7 @@ class nsSVGUtils * @return true if rendering succeeded */ static bool PaintSVGGlyph(Element* aElement, gfxContext* aContext); + /** * Get the extents of a SVG glyph. * @param aElement the SVG glyph element @@ -577,10 +568,9 @@ class nsSVGUtils * * @param aToCanvas Transform from userspace to canvas device space. */ - static nsRect - ToCanvasBounds(const gfxRect &aUserspaceRect, - const gfxMatrix &aToCanvas, - const nsPresContext *presContext); + static nsRect ToCanvasBounds(const gfxRect &aUserspaceRect, + const gfxMatrix &aToCanvas, + const nsPresContext *presContext); struct MaskUsage { bool shouldGenerateMaskLayer; @@ -595,11 +585,10 @@ class nsSVGUtils { } }; - static void - DetermineMaskUsage(nsIFrame* aFrame, bool aHandleOpacity, MaskUsage& aUsage); + static void DetermineMaskUsage(nsIFrame* aFrame, bool aHandleOpacity, + MaskUsage& aUsage); - static float - ComputeOpacity(nsIFrame* aFrame, bool aHandleOpacity); + static float ComputeOpacity(nsIFrame* aFrame, bool aHandleOpacity); /** * SVG frames expect to paint in SVG user units, which are equal to CSS px @@ -607,8 +596,7 @@ class nsSVGUtils * gfxContext's current transform to convert the context's current units from * its usual dev pixels to SVG user units/CSS px to keep the SVG code happy. */ - static gfxMatrix - GetCSSPxToDevPxMatrix(nsIFrame* aNonSVGFrame); + static gfxMatrix GetCSSPxToDevPxMatrix(nsIFrame* aNonSVGFrame); static bool IsInSVGTextSubtree(const nsIFrame* aFrame) { // Returns true if the frame is an SVGTextFrame or one of its descendants. From 8380835b796be4105de610bb1dbd38c39c608e68 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:00 +0100 Subject: [PATCH 292/300] Backed out changeset a796423751ce (bug 1333003) --- .../mozharness/configs/unittests/win_taskcluster_unittest.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testing/mozharness/configs/unittests/win_taskcluster_unittest.py b/testing/mozharness/configs/unittests/win_taskcluster_unittest.py index f715ad44e62a6..152cd1f948344 100644 --- a/testing/mozharness/configs/unittests/win_taskcluster_unittest.py +++ b/testing/mozharness/configs/unittests/win_taskcluster_unittest.py @@ -229,8 +229,7 @@ "gtest": [] }, "all_jittest_suites": { - "jittest": [], - "jittest-chunked": [], + "jittest": [] }, "all_mozbase_suites": { "mozbase": [] From 3f66a2627bf6fbf77d57c4c8aedadeacc8d4db5c Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:04 +0100 Subject: [PATCH 293/300] Backed out changeset 18fd8676751a (bug 1333003) --- testing/gtest/rungtests.py | 4 +--- testing/mochitest/runtests.py | 4 ++-- testing/mozbase/mozrunner/mozrunner/utils.py | 13 ++++--------- testing/runcppunittests.py | 4 +--- testing/xpcshell/runxpcshelltests.py | 4 +--- 5 files changed, 9 insertions(+), 20 deletions(-) diff --git a/testing/gtest/rungtests.py b/testing/gtest/rungtests.py index d2b9e52edcf58..10a9c0c5d1814 100644 --- a/testing/gtest/rungtests.py +++ b/testing/gtest/rungtests.py @@ -128,9 +128,7 @@ def build_environment(self): # ASan specific environment stuff if mozinfo.info["asan"]: # Symbolizer support - llvmsym = os.path.join( - self.xre_path, - "llvm-symbolizer" + mozinfo.info["bin_suffix"].encode('ascii')) + llvmsym = os.path.join(self.xre_path, "llvm-symbolizer") if os.path.isfile(llvmsym): env["ASAN_SYMBOLIZER_PATH"] = llvmsym log.info("gtest | ASan using symbolizer at %s", llvmsym) diff --git a/testing/mochitest/runtests.py b/testing/mochitest/runtests.py index 2f1b71b974735..5f718d58932ea 100644 --- a/testing/mochitest/runtests.py +++ b/testing/mochitest/runtests.py @@ -1554,7 +1554,7 @@ def makeTestConfig(self, options): def buildBrowserEnv(self, options, debugger=False, env=None): """build the environment variables for the specific test and operating system""" - if mozinfo.info["asan"] and mozinfo.isLinux and mozinfo.bits == 64: + if mozinfo.info["asan"]: lsanPath = SCRIPT_DIR else: lsanPath = None @@ -2029,7 +2029,7 @@ def runApp(self, else: shutdownLeaks = None - if mozinfo.info["asan"] and mozinfo.isLinux and mozinfo.bits == 64: + if mozinfo.info["asan"] and (mozinfo.isLinux or mozinfo.isMac): lsanLeaks = LSANLeaks(self.log) else: lsanLeaks = None diff --git a/testing/mozbase/mozrunner/mozrunner/utils.py b/testing/mozbase/mozrunner/mozrunner/utils.py index 850ce86825317..f96c94398d1a7 100755 --- a/testing/mozbase/mozrunner/mozrunner/utils.py +++ b/testing/mozbase/mozrunner/mozrunner/utils.py @@ -153,12 +153,10 @@ def test_environment(xrePath, env=None, crashreporter=True, debugger=False, # ASan specific environment stuff asan = bool(mozinfo.info.get("asan")) - if asan: + if asan and (mozinfo.isLinux or mozinfo.isMac): try: # Symbolizer support - llvmsym = os.path.join( - xrePath, - "llvm-symbolizer" + mozinfo.info["bin_suffix"].encode('ascii')) + llvmsym = os.path.join(xrePath, "llvm-symbolizer") if os.path.isfile(llvmsym): env["ASAN_SYMBOLIZER_PATH"] = llvmsym log.info("INFO | runtests.py | ASan using symbolizer at %s" @@ -168,11 +166,8 @@ def test_environment(xrePath, env=None, crashreporter=True, debugger=False, " ASan symbolizer at %s" % llvmsym) # Returns total system memory in kilobytes. - if mozinfo.isWin: - totalMemory = int( - os.popen("wmic computersystem get TotalPhysicalMemory").readlines()[1]) / 1024 - else: - totalMemory = int(os.popen("free").readlines()[1].split()[1]) + # Works only on unix-like platforms where `free` is in the path. + totalMemory = int(os.popen("free").readlines()[1].split()[1]) # Only 4 GB RAM or less available? Use custom ASan options to reduce # the amount of resources required to do the tests. Standard options diff --git a/testing/runcppunittests.py b/testing/runcppunittests.py index 060ce6f4e2360..d8b79f68f79a9 100755 --- a/testing/runcppunittests.py +++ b/testing/runcppunittests.py @@ -123,9 +123,7 @@ def build_environment(self): if mozinfo.info["asan"]: # Use llvm-symbolizer for ASan if available/required - llvmsym = os.path.join( - self.xre_path, - "llvm-symbolizer" + mozinfo.info["bin_suffix"].encode('ascii')) + llvmsym = os.path.join(self.xre_path, "llvm-symbolizer") if os.path.isfile(llvmsym): env["ASAN_SYMBOLIZER_PATH"] = llvmsym self.log.info("ASan using symbolizer at %s" % llvmsym) diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py index e97ffe2cd5aa9..739c8b9f10742 100755 --- a/testing/xpcshell/runxpcshelltests.py +++ b/testing/xpcshell/runxpcshelltests.py @@ -942,9 +942,7 @@ def buildEnvironment(self): usingTSan = "tsan" in self.mozInfo and self.mozInfo["tsan"] if usingASan or usingTSan: # symbolizer support - llvmsym = os.path.join( - self.xrePath, - "llvm-symbolizer" + self.mozInfo["bin_suffix"].encode('ascii')) + llvmsym = os.path.join(self.xrePath, "llvm-symbolizer") if os.path.isfile(llvmsym): if usingASan: self.env["ASAN_SYMBOLIZER_PATH"] = llvmsym From f0d073c76fe8a56809b4386e602d9cf5df92594c Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:09 +0100 Subject: [PATCH 294/300] Backed out changeset 42cf5ddabc8a (bug 1333003) --- python/mozbuild/mozbuild/action/test_archive.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/python/mozbuild/mozbuild/action/test_archive.py b/python/mozbuild/mozbuild/action/test_archive.py index 9cbaa3653dd0c..50369ff9173e2 100644 --- a/python/mozbuild/mozbuild/action/test_archive.py +++ b/python/mozbuild/mozbuild/action/test_archive.py @@ -450,16 +450,6 @@ } -if buildconfig.defines['MOZ_ASAN'] and buildconfig.substs['CLANG_CL']: - asan_dll = { - 'source': buildconfig.topobjdir, - 'base': 'dist/bin', - 'pattern': os.path.basename(buildconfig.substs['MOZ_CLANG_RT_ASAN_LIB_PATH']), - 'dest': 'bin' - } - ARCHIVE_FILES['common'].append(asan_dll) - - # "common" is our catch all archive and it ignores things from other archives. # Verify nothing sneaks into ARCHIVE_FILES without a corresponding exclusion # rule in the "common" archive. From 6fb0d128d67ef3e9d69456c7b70104d02b57fdd5 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:13 +0100 Subject: [PATCH 295/300] Backed out changeset d88370d20b83 (bug 1333003) --- browser/installer/package-manifest.in | 4 ++-- build/moz.build | 3 --- build/unix/moz.build | 3 +++ 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index 0f1488380f1e8..9a294ec2b4554 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -796,9 +796,9 @@ bin/libfreebl_32int64_3.so @RESPATH@/components/nsTerminatorTelemetry.js @RESPATH@/components/terminator.manifest -#if defined(CLANG_CXX) || defined(CLANG_CL) +#if defined(CLANG_CXX) #if defined(MOZ_ASAN) || defined(MOZ_TSAN) -@BINPATH@/llvm-symbolizer@BIN_SUFFIX@ +@BINPATH@/llvm-symbolizer #endif #endif diff --git a/build/moz.build b/build/moz.build index 0f7230fddc413..13774b08e840e 100644 --- a/build/moz.build +++ b/build/moz.build @@ -45,9 +45,6 @@ OBJDIR_FILES += ['!/dist/bin/.gdbinit_python'] if CONFIG['MOZ_ASAN'] and CONFIG['CLANG_CL']: FINAL_TARGET_FILES += ['%' + CONFIG['MOZ_CLANG_RT_ASAN_LIB_PATH']] -if CONFIG['LLVM_SYMBOLIZER']: - FINAL_TARGET_FILES += ['/' + CONFIG['LLVM_SYMBOLIZER']] - if CONFIG['MOZ_APP_BASENAME']: appini_defines = { 'TOPOBJDIR': TOPOBJDIR, diff --git a/build/unix/moz.build b/build/unix/moz.build index 95e5b92ac6c3f..3acc2c07aef10 100644 --- a/build/unix/moz.build +++ b/build/unix/moz.build @@ -10,6 +10,9 @@ if CONFIG['MOZ_LIBSTDCXX_TARGET_VERSION'] or CONFIG['MOZ_LIBSTDCXX_HOST_VERSION' if CONFIG['USE_ELF_HACK']: DIRS += ['elfhack'] +if CONFIG['LLVM_SYMBOLIZER']: + FINAL_TARGET_FILES += ['/' + CONFIG['LLVM_SYMBOLIZER']] + FINAL_TARGET_FILES += [ 'run-mozilla.sh', ] From 7a61c2bc27f153c52a6e50c51cf7f2f361b6818d Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:19 +0100 Subject: [PATCH 296/300] Backed out changeset 40fcebfabb33 (bug 1333003) --- .../taskcluster_firefox_win64_asan_debug.py | 91 ------------------- .../taskcluster_firefox_win64_asan_opt.py | 89 ------------------ 2 files changed, 180 deletions(-) delete mode 100644 testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py delete mode 100644 testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py diff --git a/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py b/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py deleted file mode 100644 index 97f712c8cca32..0000000000000 --- a/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_debug.py +++ /dev/null @@ -1,91 +0,0 @@ -import os -import sys - -config = { - ######################################################################### - ######## WINDOWS GENERIC CONFIG KEYS/VAlUES - # if you are updating this with custom 64 bit keys/values please add them - # below under the '64 bit specific' code block otherwise, update in this - # code block and also make sure this is synced between: - # - taskcluster_firefox_win32_debug - # - taskcluster_firefox_win32_opt - # - taskcluster_firefox_win64_debug - # - taskcluster_firefox_win64_opt - # - taskcluster_firefox_win32_clang - # - taskcluster_firefox_win32_clang_debug - # - taskcluster_firefox_win64_clang - # - taskcluster_firefox_win64_clang_debug - - 'default_actions': [ - 'clone-tools', - 'build', - 'check-test', - ], - 'exes': { - 'python2.7': sys.executable, - 'make': [ - sys.executable, - os.path.join( - os.getcwd(), 'build', 'src', 'build', 'pymake', 'make.py' - ) - ], - 'virtualenv': [ - sys.executable, - os.path.join( - os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py' - ) - ], - 'mach-build': [ - os.path.join(os.environ['MOZILLABUILD'], 'msys', 'bin', 'bash.exe'), - os.path.join(os.getcwd(), 'build', 'src', 'mach'), - '--log-no-times', 'build', '-v' - ], - }, - 'app_ini_path': '%(obj_dir)s/dist/bin/application.ini', - # decides whether we want to use moz_sign_cmd in env - 'enable_signing': True, - 'enable_ccache': False, - 'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'), - 'objdir': 'obj-firefox', - 'tooltool_script': [ - sys.executable, - os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py') - ], - 'tooltool_bootstrap': 'setup.sh', - 'enable_count_ctors': False, - 'max_build_output_timeout': 60 * 80, - ######################################################################### - - - ######################################################################### - ###### 64 bit specific ###### - 'base_name': 'WINNT_6.1_x86-64_%(branch)s', - 'platform': 'win64', - 'stage_platform': 'win64-asan-debug', - 'debug_build': True, - 'publish_nightly_en_US_routes': True, - 'env': { - 'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'), - 'MOZ_AUTOMATION': '1', - 'MOZ_CRASHREPORTER_NO_REPORT': '1', - 'MOZ_OBJDIR': 'obj-firefox', - 'PDBSTR_PATH': '/c/Program Files (x86)/Windows Kits/10/Debuggers/x64/srcsrv/pdbstr.exe', - 'TINDERBOX_OUTPUT': '1', - 'TOOLTOOL_CACHE': '/c/builds/tooltool_cache', - 'TOOLTOOL_HOME': '/c/builds', - 'XPCOM_DEBUG_BREAK': 'stack-and-abort', - 'MSYSTEM': 'MINGW32', - }, - 'upload_env': { - 'UPLOAD_HOST': 'localhost', - 'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'), - }, - "check_test_env": { - 'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win64\\minidump_stackwalk.exe', - 'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps', - }, - 'enable_pymake': True, - 'src_mozconfig': 'browser\\config\\mozconfigs\\win64\\debug-asan', - 'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win64\\clang.manifest', - ######################################################################### -} diff --git a/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py b/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py deleted file mode 100644 index d1d79b460b95f..0000000000000 --- a/testing/mozharness/configs/builds/taskcluster_firefox_win64_asan_opt.py +++ /dev/null @@ -1,89 +0,0 @@ -import os -import sys - -config = { - ######################################################################### - ######## WINDOWS GENERIC CONFIG KEYS/VAlUES - # if you are updating this with custom 64 bit keys/values please add them - # below under the '64 bit specific' code block otherwise, update in this - # code block and also make sure this is synced between: - # - taskcluster_firefox_win32_debug - # - taskcluster_firefox_win32_opt - # - taskcluster_firefox_win64_debug - # - taskcluster_firefox_win64_opt - # - taskcluster_firefox_win32_clang - # - taskcluster_firefox_win32_clang_debug - # - taskcluster_firefox_win64_clang - # - taskcluster_firefox_win64_clang_debug - - 'default_actions': [ - 'clone-tools', - 'build', - 'check-test', - ], - 'exes': { - 'python2.7': sys.executable, - 'make': [ - sys.executable, - os.path.join( - os.getcwd(), 'build', 'src', 'build', 'pymake', 'make.py' - ) - ], - 'virtualenv': [ - sys.executable, - os.path.join( - os.getcwd(), 'build', 'src', 'python', 'virtualenv', 'virtualenv.py' - ) - ], - 'mach-build': [ - os.path.join(os.environ['MOZILLABUILD'], 'msys', 'bin', 'bash.exe'), - os.path.join(os.getcwd(), 'build', 'src', 'mach'), - '--log-no-times', 'build', '-v' - ], - }, - 'app_ini_path': '%(obj_dir)s/dist/bin/application.ini', - # decides whether we want to use moz_sign_cmd in env - 'enable_signing': True, - 'enable_ccache': False, - 'vcs_share_base': os.path.join('y:', os.sep, 'hg-shared'), - 'objdir': 'obj-firefox', - 'tooltool_script': [ - sys.executable, - os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py') - ], - 'tooltool_bootstrap': 'setup.sh', - 'enable_count_ctors': False, - 'max_build_output_timeout': 60 * 80, - ######################################################################### - - - ######################################################################### - ###### 64 bit specific ###### - 'base_name': 'WINNT_6.1_x86-64_%(branch)s', - 'platform': 'win64', - 'stage_platform': 'win64-asan', - 'publish_nightly_en_US_routes': True, - 'env': { - 'HG_SHARE_BASE_DIR': os.path.join('y:', os.sep, 'hg-shared'), - 'MOZ_AUTOMATION': '1', - 'MOZ_CRASHREPORTER_NO_REPORT': '1', - 'MOZ_OBJDIR': 'obj-firefox', - 'PDBSTR_PATH': '/c/Program Files (x86)/Windows Kits/10/Debuggers/x64/srcsrv/pdbstr.exe', - 'TINDERBOX_OUTPUT': '1', - 'TOOLTOOL_CACHE': '/c/builds/tooltool_cache', - 'TOOLTOOL_HOME': '/c/builds', - 'MSYSTEM': 'MINGW32', - }, - 'upload_env': { - 'UPLOAD_HOST': 'localhost', - 'UPLOAD_PATH': os.path.join(os.getcwd(), 'public', 'build'), - }, - "check_test_env": { - 'MINIDUMP_STACKWALK': '%(abs_tools_dir)s\\breakpad\\win64\\minidump_stackwalk.exe', - 'MINIDUMP_SAVE_PATH': '%(base_work_dir)s\\minidumps', - }, - 'enable_pymake': True, - 'src_mozconfig': 'browser\\config\\mozconfigs\\win64\\nightly-asan', - 'tooltool_manifest_src': 'browser\\config\\tooltool-manifests\\win64\\clang.manifest', - ######################################################################### -} From ac4e189838709ca14b876e68d6290f66720e8f26 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:24 +0100 Subject: [PATCH 297/300] Backed out changeset 911cc14899c8 (bug 1333003) --- taskcluster/ci/build/windows.yml | 40 ------------------- taskcluster/ci/test/test-platforms.yml | 5 --- .../transforms/gecko_v2_whitelist.py | 2 - taskcluster/taskgraph/transforms/tests.py | 7 +--- 4 files changed, 2 insertions(+), 52 deletions(-) diff --git a/taskcluster/ci/build/windows.yml b/taskcluster/ci/build/windows.yml index 8b1082a9353b8..e581a18cae7de 100644 --- a/taskcluster/ci/build/windows.yml +++ b/taskcluster/ci/build/windows.yml @@ -235,43 +235,3 @@ win32-qr/opt: config: - builds/taskcluster_firefox_win32_qr_opt.py run-on-projects: [ 'graphics' ] - -win64-asan/debug: - description: "Win64 Debug ASAN" - index: - product: firefox - job-name: win64-asan-debug - treeherder: - platform: windows2012-64/asan - symbol: tc(Bd) - tier: 3 - worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 - worker: - implementation: generic-worker - max-run-time: 7200 - run: - using: mozharness - script: mozharness/scripts/fx_desktop_build.py - config: - - builds/taskcluster_firefox_win64_asan_debug.py - run-on-projects: [] - -win64-asan/opt: - description: "Win64 Opt ASAN" - index: - product: firefox - job-name: win64-asan-opt - treeherder: - platform: windows2012-64/asan - symbol: tc(Bo) - tier: 3 - worker-type: aws-provisioner-v1/gecko-{level}-b-win2012 - worker: - implementation: generic-worker - max-run-time: 7200 - run: - using: mozharness - script: mozharness/scripts/fx_desktop_build.py - config: - - builds/taskcluster_firefox_win64_asan_opt.py - run-on-projects: [] \ No newline at end of file diff --git a/taskcluster/ci/test/test-platforms.yml b/taskcluster/ci/test/test-platforms.yml index f86109eee02da..c4fffd0c454d0 100644 --- a/taskcluster/ci/test/test-platforms.yml +++ b/taskcluster/ci/test/test-platforms.yml @@ -150,11 +150,6 @@ windows10-64-vm/opt: # test-sets: # - windows-gpu-tests -windows10-64-asan/opt: - build-platform: win64-asan/opt - test-sets: - - common-tests - ## # MacOS X platforms (matching /macosx.*/) diff --git a/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py b/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py index 6801cb3e29f17..dc52a3ac964d7 100644 --- a/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py +++ b/taskcluster/taskgraph/transforms/gecko_v2_whitelist.py @@ -84,8 +84,6 @@ 'win64-st-an-opt', 'win64-qr-debug', 'win64-qr-opt', - 'win64-asan-debug', - 'win64-asan-opt', ]) JOB_NAME_WHITELIST_ERROR = """\ diff --git a/taskcluster/taskgraph/transforms/tests.py b/taskcluster/taskgraph/transforms/tests.py index ecafbaf98a02c..2519c8d963269 100644 --- a/taskcluster/taskgraph/transforms/tests.py +++ b/taskcluster/taskgraph/transforms/tests.py @@ -46,8 +46,7 @@ 'windows7-32-vm': 'aws-provisioner-v1/gecko-t-win7-32', 'windows7-32': 'aws-provisioner-v1/gecko-t-win7-32-gpu', 'windows10-64-vm': 'aws-provisioner-v1/gecko-t-win10-64', - 'windows10-64': 'aws-provisioner-v1/gecko-t-win10-64-gpu', - 'windows10-64-asan': 'aws-provisioner-v1/gecko-t-win10-64-gpu' + 'windows10-64': 'aws-provisioner-v1/gecko-t-win10-64-gpu' } logger = logging.getLogger(__name__) @@ -357,7 +356,6 @@ def set_treeherder_machine_platform(config, tests): 'linux64-pgo/opt': 'linux64/pgo', 'macosx64/debug': 'osx-10-10/debug', 'macosx64/opt': 'osx-10-10/opt', - 'win64-asan/opt': 'windows10-64/asan', # The build names for Android platforms have partially evolved over the # years and need to be translated. 'android-api-15/debug': 'android-4-3-armv7-api15/debug', @@ -451,8 +449,7 @@ def set_download_symbols(config, tests): for test in tests: if test['test-platform'].split('/')[-1] == 'debug': test['mozharness']['download-symbols'] = True - elif test['build-platform'] == 'linux64-asan/opt' or \ - test['build-platform'] == 'windows10-64-asan/opt': + elif test['build-platform'] == 'linux64-asan/opt': if 'download-symbols' in test['mozharness']: del test['mozharness']['download-symbols'] else: From cc4c8d1b0492ac04c8a8d966092d77bb98b8312b Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:38:48 +0100 Subject: [PATCH 298/300] Backed out changeset a89806ba0faa (bug 1333003) for bustage --- browser/config/mozconfigs/win64/debug-asan | 17 -------------- browser/config/mozconfigs/win64/nightly-asan | 17 -------------- build/win64/mozconfig.asan | 24 -------------------- 3 files changed, 58 deletions(-) delete mode 100644 browser/config/mozconfigs/win64/debug-asan delete mode 100644 browser/config/mozconfigs/win64/nightly-asan delete mode 100644 build/win64/mozconfig.asan diff --git a/browser/config/mozconfigs/win64/debug-asan b/browser/config/mozconfigs/win64/debug-asan deleted file mode 100644 index 3fb3eb17be214..0000000000000 --- a/browser/config/mozconfigs/win64/debug-asan +++ /dev/null @@ -1,17 +0,0 @@ -MOZ_AUTOMATION_L10N_CHECK=0 - -. "$topsrcdir/build/mozconfig.win-common" -. "$topsrcdir/browser/config/mozconfigs/common" - -ac_add_options --enable-debug -ac_add_options --enable-optimize="-O1" - -. "$topsrcdir/build/win64/mozconfig.vs-latest" - -. "$topsrcdir/build/win64/mozconfig.asan" - -export MOZ_PACKAGE_JSSHELL=1 -export MOZ_PKG_SPECIAL=asan - -. "$topsrcdir/build/mozconfig.common.override" -. "$topsrcdir/build/mozconfig.cache" diff --git a/browser/config/mozconfigs/win64/nightly-asan b/browser/config/mozconfigs/win64/nightly-asan deleted file mode 100644 index 478d5581b77fa..0000000000000 --- a/browser/config/mozconfigs/win64/nightly-asan +++ /dev/null @@ -1,17 +0,0 @@ -MOZ_AUTOMATION_L10N_CHECK=0 - -. "$topsrcdir/build/mozconfig.win-common" -. "$topsrcdir/browser/config/mozconfigs/common" - -ac_add_options --disable-debug -ac_add_options --enable-optimize="-O2 -gline-tables-only" - -. "$topsrcdir/build/win64/mozconfig.vs-latest" - -. "$topsrcdir/build/win64/mozconfig.asan" - -export MOZ_PACKAGE_JSSHELL=1 -export MOZ_PKG_SPECIAL=asan - -. "$topsrcdir/build/mozconfig.common.override" -. "$topsrcdir/build/mozconfig.cache" diff --git a/build/win64/mozconfig.asan b/build/win64/mozconfig.asan deleted file mode 100644 index 533216a670dec..0000000000000 --- a/build/win64/mozconfig.asan +++ /dev/null @@ -1,24 +0,0 @@ -ac_add_options --target=x86_64-pc-mingw32 -ac_add_options --host=x86_64-pc-mingw32 - -CLANG_LIB_DIR="$(cd $topsrcdir/clang/lib/clang/* && cd lib/windows && pwd)" - -export LIB=$LIB:$CLANG_LIB_DIR -mk_export_correct_style LIB -export LDFLAGS="clang_rt.asan_dynamic-x86_64.lib clang_rt.asan_dynamic_runtime_thunk-x86_64.lib" - -export LLVM_SYMBOLIZER="$topsrcdir/clang/bin/llvm-symbolizer.exe" -export MOZ_CLANG_RT_ASAN_LIB_PATH="${CLANG_LIB_DIR}/clang_rt.asan_dynamic-x86_64.dll" - -# Enable ASan specific code and build workarounds -ac_add_options --enable-address-sanitizer - -# Mandatory options required for ASan builds -ac_add_options --enable-debug-symbols -ac_add_options --disable-install-strip -ac_add_options --disable-jemalloc -ac_add_options --disable-crashreporter -ac_add_options --disable-profiling - -. "$topsrcdir/build/mozconfig.vs-common" -. "$topsrcdir/build/mozconfig.clang-cl" From d723bbdf0f5bc8339ee80c751659293b566cd703 Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 10:47:18 +0100 Subject: [PATCH 299/300] Backed out changeset 9476c9a5f4c9 (bug 1349389) for causing dt4 perma failures --- toolkit/components/telemetry/TelemetryController.jsm | 2 ++ .../telemetry/tests/unit/test_TelemetryEnvironment.js | 4 ---- toolkit/modules/ClientID.jsm | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/toolkit/components/telemetry/TelemetryController.jsm b/toolkit/components/telemetry/TelemetryController.jsm index f511d3f818a66..e9b5984413151 100644 --- a/toolkit/components/telemetry/TelemetryController.jsm +++ b/toolkit/components/telemetry/TelemetryController.jsm @@ -12,8 +12,10 @@ const Cu = Components.utils; const myScope = this; Cu.import("resource://gre/modules/Log.jsm"); +Cu.import("resource://gre/modules/debug.js", this); Cu.import("resource://gre/modules/Services.jsm", this); Cu.import("resource://gre/modules/XPCOMUtils.jsm", this); +Cu.import("resource://gre/modules/osfile.jsm", this); Cu.import("resource://gre/modules/Promise.jsm", this); Cu.import("resource://gre/modules/PromiseUtils.jsm", this); Cu.import("resource://gre/modules/Task.jsm", this); diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js b/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js index b2e6bb17141de..cf1fc4bb6bbc1 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetryEnvironment.js @@ -144,10 +144,6 @@ var SysInfo = { } }, - getPropertyAsUint32(name) { - return this.get(name); - }, - get(name) { return this._genuine.get(name); }, diff --git a/toolkit/modules/ClientID.jsm b/toolkit/modules/ClientID.jsm index 6cec320c92dee..8028dcdfcd8b5 100644 --- a/toolkit/modules/ClientID.jsm +++ b/toolkit/modules/ClientID.jsm @@ -8,6 +8,7 @@ this.EXPORTED_SYMBOLS = ["ClientID"]; const {classes: Cc, interfaces: Ci, results: Cr, utils: Cu} = Components; +Cu.import("resource://gre/modules/osfile.jsm"); Cu.import("resource://gre/modules/Task.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Preferences.jsm"); @@ -18,8 +19,6 @@ const LOGGER_PREFIX = "ClientID::"; XPCOMUtils.defineLazyModuleGetter(this, "CommonUtils", "resource://services-common/utils.js"); -XPCOMUtils.defineLazyModuleGetter(this, "OS", - "resource://gre/modules/osfile.jsm"); XPCOMUtils.defineLazyGetter(this, "gDatareportingPath", () => { return OS.Path.join(OS.Constants.Path.profileDir, "datareporting"); From 413a216a93298288ce1d0aec5a04c2dcbf62711b Mon Sep 17 00:00:00 2001 From: "Carsten \"Tomcat\" Book" Date: Thu, 23 Mar 2017 14:28:25 +0100 Subject: [PATCH 300/300] Backed out changeset ad882b32f2d0 (bug 1347101) for merge bustage on a CLOSED TREE --- dom/media/platforms/wmf/MFTDecoder.cpp | 34 ++--- dom/media/platforms/wmf/MFTDecoder.h | 7 +- .../platforms/wmf/WMFAudioMFTManager.cpp | 9 -- .../platforms/wmf/WMFVideoMFTManager.cpp | 144 ++++++++++-------- dom/media/platforms/wmf/WMFVideoMFTManager.h | 7 +- 5 files changed, 105 insertions(+), 96 deletions(-) diff --git a/dom/media/platforms/wmf/MFTDecoder.cpp b/dom/media/platforms/wmf/MFTDecoder.cpp index ce4f1277b93bb..a8f4004f0c18e 100644 --- a/dom/media/platforms/wmf/MFTDecoder.cpp +++ b/dom/media/platforms/wmf/MFTDecoder.cpp @@ -51,7 +51,7 @@ MFTDecoder::SetMediaTypes(IMFMediaType* aInputType, HRESULT hr = mDecoder->SetInputType(0, aInputType, 0); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - hr = SetDecoderOutputType(true /* match all attributes */, aCallback, aData); + hr = SetDecoderOutputType(aCallback, aData); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); hr = mDecoder->GetInputStreamInfo(0, &mInputStreamInfo); @@ -76,34 +76,21 @@ MFTDecoder::GetAttributes() } HRESULT -MFTDecoder::SetDecoderOutputType(bool aMatchAllAttributes, - ConfigureOutputCallback aCallback, - void* aData) +MFTDecoder::SetDecoderOutputType(ConfigureOutputCallback aCallback, void* aData) { NS_ENSURE_TRUE(mDecoder != nullptr, E_POINTER); - GUID currentSubtype = {0}; - HRESULT hr = mOutputType->GetGUID(MF_MT_SUBTYPE, ¤tSubtype); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - // Iterate the enumerate the output types, until we find one compatible // with what we need. + HRESULT hr; RefPtr outputType; UINT32 typeIndex = 0; while (SUCCEEDED(mDecoder->GetOutputAvailableType( 0, typeIndex++, getter_AddRefs(outputType)))) { - GUID outSubtype = {0}; - hr = outputType->GetGUID(MF_MT_SUBTYPE, &outSubtype); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - - BOOL resultMatch = currentSubtype == outSubtype; - - if (resultMatch && aMatchAllAttributes) { - hr = mOutputType->Compare(outputType, MF_ATTRIBUTES_MATCH_OUR_ITEMS, - &resultMatch); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - } - if (resultMatch == TRUE) { + BOOL resultMatch; + hr = mOutputType->Compare( + outputType, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &resultMatch); + if (SUCCEEDED(hr) && resultMatch == TRUE) { if (aCallback) { hr = aCallback(outputType, aData); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); @@ -237,6 +224,13 @@ MFTDecoder::Output(RefPtr* aOutput) } if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { + // Type change, probably geometric aperture change. + // Reconfigure decoder output type, so that GetOutputMediaType() + // returns the new type, and return the error code to caller. + // This is an expected failure, so don't warn on encountering it. + hr = SetDecoderOutputType(nullptr, nullptr); + NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + // Return the error, so that the caller knows to retry. return MF_E_TRANSFORM_STREAM_CHANGE; } diff --git a/dom/media/platforms/wmf/MFTDecoder.h b/dom/media/platforms/wmf/MFTDecoder.h index c7b128f876de5..e2cc2b3dc0449 100644 --- a/dom/media/platforms/wmf/MFTDecoder.h +++ b/dom/media/platforms/wmf/MFTDecoder.h @@ -87,10 +87,11 @@ class MFTDecoder final // Sends a message to the MFT. HRESULT SendMFTMessage(MFT_MESSAGE_TYPE aMsg, ULONG_PTR aData); - HRESULT SetDecoderOutputType(bool aMatchAllAttributes, - ConfigureOutputCallback aCallback, - void* aData); + + HRESULT SetDecoderOutputType(ConfigureOutputCallback aCallback, void* aData); private: + + HRESULT CreateOutputSample(RefPtr* aOutSample); MFT_INPUT_STREAM_INFO mInputStreamInfo; diff --git a/dom/media/platforms/wmf/WMFAudioMFTManager.cpp b/dom/media/platforms/wmf/WMFAudioMFTManager.cpp index 98d0fa4b23df1..5a1a2f021c66f 100644 --- a/dom/media/platforms/wmf/WMFAudioMFTManager.cpp +++ b/dom/media/platforms/wmf/WMFAudioMFTManager.cpp @@ -180,12 +180,6 @@ WMFAudioMFTManager::Init() hr = outputType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 32); NS_ENSURE_TRUE(SUCCEEDED(hr), false); - hr = outputType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, mAudioChannels); - NS_ENSURE_TRUE(SUCCEEDED(hr), false); - - hr = outputType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, 1); - NS_ENSURE_TRUE(SUCCEEDED(hr), false); - hr = decoder->SetMediaTypes(inputType, outputType); NS_ENSURE_TRUE(SUCCEEDED(hr), false); @@ -239,9 +233,6 @@ WMFAudioMFTManager::Output(int64_t aStreamOffset, return hr; } if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { - hr = mDecoder->SetDecoderOutputType(true /* check all attribute */, - nullptr, - nullptr); hr = UpdateOutputType(); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); // Catch infinite loops, but some decoders perform at least 2 stream diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp index b78b6478b54f7..5a4a65c77a0d5 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp @@ -109,8 +109,8 @@ WMFVideoMFTManager::WMFVideoMFTManager( layers::ImageContainer* aImageContainer, bool aDXVAEnabled) : mVideoInfo(aConfig) - , mImageSize(aConfig.mImage) , mVideoStride(0) + , mImageSize(aConfig.mImage) , mImageContainer(aImageContainer) , mDXVAEnabled(aDXVAEnabled) , mKnowsCompositor(aKnowsCompositor) @@ -572,36 +572,9 @@ WMFVideoMFTManager::InitInternal() hr = SetDecoderMediaTypes(); NS_ENSURE_TRUE(SUCCEEDED(hr), false); - RefPtr outputType; - hr = mDecoder->GetOutputMediaType(outputType); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - - if (mUseHwAccel && !CanUseDXVA(outputType)) { - mDXVAEnabled = false; - // DXVA initialization actually failed, re-do initialisation. - return InitInternal(aForceD3D9); - } - LOG("Video Decoder initialized, Using DXVA: %s", (mUseHwAccel ? "Yes" : "No")); - if (mDXVA2Manager) { - hr = mDXVA2Manager->ConfigureForSize(mVideoInfo.ImageRect().width, - mVideoInfo.ImageRect().height); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - } else { - GetDefaultStride(outputType, mVideoInfo.ImageRect().width, &mVideoStride); - } - LOG("WMFVideoMFTManager frame geometry stride=%u picture=(%d, %d, %d, %d) " - "display=(%d,%d)", - mVideoStride, - mVideoInfo.ImageRect().x, - mVideoInfo.ImageRect().y, - mVideoInfo.ImageRect().width, - mVideoInfo.ImageRect().height, - mVideoInfo.mDisplay.width, - mVideoInfo.mDisplay.height); - return true; } @@ -623,14 +596,18 @@ WMFVideoMFTManager::SetDecoderMediaTypes() MFVideoInterlace_MixedInterlaceOrProgressive); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - hr = inputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + // MSFT MFT needs this frame size set for VP9? + if (mStreamType == VP9 || mStreamType == VP8) { + hr = + inputType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); + NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - hr = MFSetAttributeSize(inputType, - MF_MT_FRAME_SIZE, - mVideoInfo.ImageRect().width, - mVideoInfo.ImageRect().height); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + hr = MFSetAttributeSize(inputType, + MF_MT_FRAME_SIZE, + mVideoInfo.ImageRect().width, + mVideoInfo.ImageRect().height); + NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + } RefPtr outputType; hr = wmf::MFCreateMediaType(getter_AddRefs(outputType)); @@ -639,12 +616,6 @@ WMFVideoMFTManager::SetDecoderMediaTypes() hr = outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - hr = MFSetAttributeSize(outputType, - MF_MT_FRAME_SIZE, - mVideoInfo.ImageRect().width, - mVideoInfo.ImageRect().height); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - GUID outputSubType = mUseHwAccel ? MFVideoFormat_NV12 : MFVideoFormat_YV12; hr = outputType->SetGUID(MF_MT_SUBTYPE, outputSubType); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); @@ -664,19 +635,18 @@ WMFVideoMFTManager::Input(MediaRawData* aSample) return E_FAIL; } - RefPtr inputSample; HRESULT hr = mDecoder->CreateInputSample(aSample->Data(), uint32_t(aSample->Size()), aSample->mTime, - &inputSample); - NS_ENSURE_TRUE(SUCCEEDED(hr) && inputSample != nullptr, hr); + &mLastInput); + NS_ENSURE_TRUE(SUCCEEDED(hr) && mLastInput != nullptr, hr); mLastDuration = aSample->mDuration; mLastTime = aSample->mTime; mSamplesCount++; // Forward sample data to the decoder. - return mDecoder->Input(inputSample); + return mDecoder->Input(mLastInput); } class SupportsConfigEvent : public Runnable { @@ -747,6 +717,69 @@ WMFVideoMFTManager::CanUseDXVA(IMFMediaType* aType) return event->mSupportsConfig; } +HRESULT +WMFVideoMFTManager::ConfigureVideoFrameGeometry() +{ + RefPtr mediaType; + HRESULT hr = mDecoder->GetOutputMediaType(mediaType); + NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + + // If we enabled/disabled DXVA in response to a resolution + // change then we need to renegotiate our media types, + // and resubmit our previous frame (since the MFT appears + // to lose it otherwise). + if (mUseHwAccel && !CanUseDXVA(mediaType)) { + mDXVAEnabled = false; + if (!Init()) { + return E_FAIL; + } + + mDecoder->Input(mLastInput); + return S_OK; + } + + // Verify that the video subtype is what we expect it to be. + // When using hardware acceleration/DXVA2 the video format should + // be NV12, which is DXVA2's preferred format. For software decoding + // we use YV12, as that's easier for us to stick into our rendering + // pipeline than NV12. NV12 has interleaved UV samples, whereas YV12 + // is a planar format. + GUID videoFormat; + hr = mediaType->GetGUID(MF_MT_SUBTYPE, &videoFormat); + NS_ENSURE_TRUE(videoFormat == MFVideoFormat_NV12 || !mUseHwAccel, E_FAIL); + NS_ENSURE_TRUE(videoFormat == MFVideoFormat_YV12 || mUseHwAccel, E_FAIL); + + nsIntRect pictureRegion; + hr = GetPictureRegion(mediaType, pictureRegion); + NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + + UINT32 width = pictureRegion.width; + UINT32 height = pictureRegion.height; + mImageSize = nsIntSize(width, height); + // Calculate and validate the picture region and frame dimensions after + // scaling by the pixel aspect ratio. + pictureRegion = mVideoInfo.ScaledImageRect(width, height); + if (!IsValidVideoRegion(mImageSize, pictureRegion, mVideoInfo.mDisplay)) { + // Video track's frame sizes will overflow. Ignore the video track. + return E_FAIL; + } + + if (mDXVA2Manager) { + hr = mDXVA2Manager->ConfigureForSize(width, height); + NS_ENSURE_TRUE(SUCCEEDED(hr), hr); + } + + // Success! Save state. + GetDefaultStride(mediaType, width, &mVideoStride); + + LOG("WMFVideoMFTManager frame geometry frame=(%u,%u) stride=%u picture=(%d, %d, %d, %d) display=(%d,%d)", + width, height, + mVideoStride, + pictureRegion.x, pictureRegion.y, pictureRegion.width, pictureRegion.height, + mVideoInfo.mDisplay.width, mVideoInfo.mDisplay.height); + + return S_OK; +} HRESULT WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample, @@ -940,25 +973,13 @@ WMFVideoMFTManager::Output(int64_t aStreamOffset, if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) { return MF_E_TRANSFORM_NEED_MORE_INPUT; } - if (hr == MF_E_TRANSFORM_STREAM_CHANGE) { + // Video stream output type change. Probably a geometric apperature + // change. Reconfigure the video geometry, so that we output the + // correct size frames. MOZ_ASSERT(!sample); - // Video stream output type change, probably geometric aperture change. - // We must reconfigure the decoder output type. - hr = mDecoder->SetDecoderOutputType(false /* check all attribute */, - nullptr, - nullptr); + hr = ConfigureVideoFrameGeometry(); NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - - if (!mUseHwAccel) { - // The stride may have changed, recheck for it. - RefPtr outputType; - hr = mDecoder->GetOutputMediaType(outputType); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - hr = GetDefaultStride(outputType, mVideoInfo.ImageRect().width, - &mVideoStride); - NS_ENSURE_TRUE(SUCCEEDED(hr), hr); - } // Catch infinite loops, but some decoders perform at least 2 stream // changes on consecutive calls, so be permissive. // 100 is arbitrarily > 2. @@ -967,7 +988,6 @@ WMFVideoMFTManager::Output(int64_t aStreamOffset, ++typeChangeCount; continue; } - if (SUCCEEDED(hr)) { if (!sample) { LOG("Video MFTDecoder returned success but no output!"); diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.h b/dom/media/platforms/wmf/WMFVideoMFTManager.h index 56dbfaac1314b..60f51cfa66278 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.h +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.h @@ -73,6 +73,8 @@ class WMFVideoMFTManager : public MFTManager bool InitInternal(); + HRESULT ConfigureVideoFrameGeometry(); + HRESULT CreateBasicVideoFrame(IMFSample* aSample, int64_t aStreamOffset, VideoData** aOutVideoData); @@ -86,14 +88,15 @@ class WMFVideoMFTManager : public MFTManager bool CanUseDXVA(IMFMediaType* aType); // Video frame geometry. - const VideoInfo mVideoInfo; - const nsIntSize mImageSize; + VideoInfo mVideoInfo; uint32_t mVideoStride; + nsIntSize mImageSize; RefPtr mImageContainer; RefPtr mKnowsCompositor; nsAutoPtr mDXVA2Manager; + RefPtr mLastInput; float mLastDuration; int64_t mLastTime = 0; bool mDraining = false;